使用正则表达式映射列表



我有一个字符串,看起来像:

(((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
  • 和右括号CC_25

对于每一个匹配,我们将其替换为第一组(CC_26)的内容,我们得到了所需的结果。

最新更新