如何使用python re模块在字符串中自动查找类似'c ++'的模式?

时间:2013-12-08 07:38:25

标签: python regex escaping

现在我有一个模式列表:

patterns = ['php', 'java', 'c++']

我希望在另一个字符串中匹配它,比如r'c ++ primer'。 我想用python re模块来做,但问题是,如果我使用:

for pattern in patterns:
    re.findall(pattern, r'php php java java c++ c++')

我会收到错误,因为'+'在正则表达式中有特殊含义。

那么在这种情况下如何修复c++c*之类的内容?

请注意,我要匹配很多模式,因此我不想手动将c++之类的所有内容转换为c\+\+

感谢您的关注。

2 个答案:

答案 0 :(得分:4)

使用字符类。在角色类+special meaning之外,因此它不会按原样运行,您需要先将其转义:r'c\+\+'

>>> import re
>>> re.findall(r'[+]{2}', r'c++ primer') 
['++']

更新1:

如果您已预定义正则表达式,请对这些模式使用re.escape

>>> patterns = ['php', 'java', 'c++']
>>> for pattern in patterns:
        print re.findall(re.escape(pattern), r'php php java java c++ c++')
...     
['php', 'php']
['java', 'java']
['c++', 'c++']

更新2:

>>> to_be_escaped = ('c++',)  #patterns that need to be escaped
>>> new_patterns = [re.escape(p) if p in to_be_escaped else p for p in patterns]
>>> for pattern in new_patterns:
        print re.findall(pattern, r'php php java java c++ c++ .net')
...     
['php', 'php']
['java', 'java']
['c++', 'c++']
['.net']

答案 1 :(得分:3)

使用+退出\

pattern = r'c\+\+'
import re
print re.findall(pattern, r'c++ primer')

<强>输出

['c++']

修改

import re
patterns = ['php', 'java', 'c\+\+']
for pattern in patterns:
    print re.findall(pattern, r'php php java java c++ c++')

<强>输出

['php', 'php']
['java', 'java']
['c++', 'c++']