现在我有一个模式列表:
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\+\+
。
感谢您的关注。
答案 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++']