在Python中转义正则表达式字符串

Escaping regex string in Python

我想使用来自用户的输入作为搜索某些文本的regex模式。它可以工作,但是我如何处理用户在regex中放置有意义的字符的情况?例如,用户希望搜索单词(s):regex引擎将把(s)作为一个组。我想把它当作一根绳子来对待。我可以在用户输入上运行replace,用\(替换(,用\)替换),但问题是我需要为每个可能的regex符号进行替换。你知道更好的方法吗?


为此,请使用re.escape()函数:

4.2.3 re模块内容

escape(string)

Return string with all non-alphanumerics backslashed; this is useful if you want to match an arbitrary literal string that may have regular expression metacharacters in it.

一个简单的示例,搜索所提供的字符串中出现的任意字符串(可选后跟"s"),并返回match对象。

1
2
3
def simplistic_plural(word, text):
    word_or_plural = re.escape(word) + 's?'
    return re.match(word_or_plural, text)

您可以使用re.escape():

re.escape(string)
Return string with all non-alphanumerics backslashed; this is useful if you want to match an arbitrary literal string that may have regular expression metacharacters in it.

1
2
3
>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'


不幸的是,re.escape()不适用于替换字符串:

1
2
>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'

解决方法是将替换件放入lambda中:

1
2
>>> re.sub('a', lambda _: '_', 'aa')
'__'

因为lambda的返回值被re.sub()视为文本字符串。


请试一试:

Q和E作为锚

将或条件与完整的单词或regex匹配。

引用链接:如何匹配regex中包含特殊字符的整个单词