但有时候,我们只想让这些符号表示它本来的意思,不想让它的特殊意义表露出来,应该怎么办?
我们知道,在正则表达式中可以使用反斜杠来让一个特殊符号变成普通符号,例如\.
表示普通的小数点,\$
表示普通的美元符号。
现在我有一个列表keywords_list
,里面是100个字符串,我想判断是否有任意一个字符串在某个给定的句子中。如果用 for 循环一个一个去检查,效率非常低。于是可以考虑使用正则表达式:
import re
pattern = re.compile('|'.join(keywords_list))
if pattern.search('目标句子'):
print('目标句子中包含某个关键词')
但假设 keywords_list
列表中有如下的字符串:
keywords_list = ['4.5', '+{d', '***']
那么我们使用正则表达式就会导致报错,如下图所示。
这是因为这些字符串里面存在特殊的符号,这些符号在正则表达式里面有特殊的意义,有使用的规范,不能随意使用。
但是,keywords_list
里面有各种各样的特殊符号,难道要一个一个取出来,逐一x.replace('+', '\+').replace('.', '\.').replace('*', '\*')...
?
当然不用,Python 的正则表达式模块已经帮你想好了解决办法,使用re.escape
就能自动处理所有的特殊符号了!
它的用法如下:
>>> import re
>>> keywords_list = ['4.5', '+{d', '***']
>>> pattern_str = '|'.join(keywords_list)
>>> safe_pattern_str = re.escape(pattern_str)
>>> print(safe_pattern_str)
4\.5\|\+\{d\|\*\*\*
>>> re.compile(safe_pattern_str)
re.compile('4\\.5\\|\\+\\{d\\|\\*\\*\\*')
>>>
运行效果如下图所示:
解决问题。