我有一个看起来像的字符串:
(((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
提取所有这些字符串,但我想将它们映射回新格式。最干净的方法是什么?
谢谢。
答案 0 :(得分:2)
以下内容应该有效:
>>> re.sub(r'\((\w{4} \d{3})\)', r'\1', s)
'((ENGL 210 or COMM 243 or COMM 205) and ECEN 314 and ECEN 325)'
re.sub
将匹配包含以下内容的模式:
\(
(...)
\w{4}
\d{3}
\)
对于每个匹配,我们将其替换为第一组(\1
)的内容,我们会得到所需的结果。
答案 1 :(得分:2)
您可以使用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)
答案 2 :(得分:2)
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)'
解释,重新发布第一个参数
中定义常规表达式
r'
将在单引号
\(
匹配左括号,这是您要删除的那个
(
打开prenthesis来定义一个新的"组"。其中的内容将存储为匹配的"组"作为正则表达式组编号1匹配组#1
[A-Z]{4}
匹配四个大写字母
也匹配一个空格
[\d]{4}
也匹配四位
)
关闭第1组
\)
关闭匹配的括号(您要移除的另一个)
'
关闭正则表达式
解释,重新发布第二个参数
中定义常规表达式
r'
将在单引号
\1
恢复上一个参数中匹配的组号
'
关闭正则表达式