带有正则表达式的地图列表

时间:2015-07-25 23:22:18

标签: python regex

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

(((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提取所有这些字符串,但我想将它们映射回新格式。最干净的方法是什么?

谢谢。

3 个答案:

答案 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将匹配包含以下内容的模式:

  • 左括号\(
  • 第一组(...)
    • 4个字母\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恢复上一个参数中匹配的组号

  
     

'关闭正则表达式