我有一个字符串,看起来像:
(((ENGL 210) or (COMM 243) or (COMM 205)) and (ECEN 314) and (ECEN 325))
我想把它转换成:
((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)
基本上将形式为(cccc ddd)
的字符串中的所有内容映射到cccc ddd
,其中c
是一个字符,d
是一个数字。
我知道我可以使用re
提取所有这样的字符串,但我想把它们映射回新的格式。最干净的方法是什么?
谢谢。
import re
t = '(((ENGL 210) or (COMM 243) or (COMM 205)) and (ECEN 314) and (ECEN 325))'
re.sub(r'(([A-Z]{4} [d]{3}))', r'1', t)
结果'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)'
解释,re.sub第一个参数
内定义正则表达式
r'
将在单引号
(
是匹配左括号,这是你想要删除的
(
开头前置定义一个新的"group"。其中的内容将作为匹配的"组"存储为regex组号1匹配组#1
[A-Z]{4}
匹配四个字符大写字母
也匹配一个空格
)
也匹配四位数字
)
close group number 1
'
闭合匹配括号(要删除的另一个)
r'
关闭正则表达式
解释,re.sub第二个参数
内定义正则表达式
1
将在单引号
'
恢复前一个参数匹配的组号
re.sub
关闭正则表达式
您可以使用re.sub
来做到这一点:
>>> import re
>>> s = '(((ENGL 210) or (COMM 243) or (COMM 205)) and (ECEN 314) and (ECEN 325))'
>>> re.sub(r'(([^()]+))', r'1', s)
'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)'
如果你想严格要求格式:
>>> re.sub(r'((w+ d+))', r'1', s)
下面应该可以工作:
>>> re.sub(r'((w{4} d{3}))', r'1', s)
'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)'
(
将匹配由:
- a左括号
(...)
- 是
w{4}
的第一组- 4字母
d{3}
- a
- 三位
1
- 4字母
- 和右括号CC_25
对于每一个匹配,我们将其替换为第一组(CC_26)的内容,我们得到了所需的结果。