现在我有一个模式列表:
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\+\+。
感谢您的关注。
请您参考如下方法:
使用字符类。在字符类之外 + a 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']
