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


229

我想使用用户输入作为正则表达式模式来搜索某些文本。它可以工作,但是如何处理用户在正则表达式中放置具有含义的字符的情况?例如,用户要搜索Word (s):正则表达式引擎会将(s)分组。我希望它像对待字符串一样对待它"(s)"。我可以replace在用户输入上运行并将(with \()with 替换,\)但是问题是我将需要对每个可能的正则表达式符号进行替换。你知道更好的方法吗?

Answers:


324

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

4.2.3 re模块内容

转义(字符串)

返回所有非字母数字加反斜杠的字符串;如果要匹配可能包含正则表达式元字符的任意文字字符串,则此功能很有用。

一个简单的示例,搜索提供的字符串的任何出现情况(可选)后跟“ s”,然后返回匹配对象。

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

53

您可以使用re.escape()

re.escape(string)返回所有非字母数字加反斜杠的字符串;如果要匹配可能包含正则表达式元字符的任意文字字符串,则此功能很有用。

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

3

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

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

一种解决方案是将替换项放在lambda中:

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

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


3
repl对参数re.sub是一个字符串,而不是一个正则表达式; 首先申请re.escape它没有任何意义。
Tripleee '18

5
@tripleee这是不正确的,该repl参数不是简单的字符串,而是经过解析的。例如,re.sub(r'(.)', r'\1', 'X')将返回X,而不是\1
Flimm '18

4
以下是转义该repl参数的相关问题:stackoverflow.com/q/49943270/247696
Flimm,

3
在版本3.3中更改:'_'字符不再转义。在版本3.7中进行了更改:仅对在正则表达式中具有特殊含义的字符进行转义。(为什么要花这么长时间?)
Cees Timmerman

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.