转义正则表达式字符串

Posted

技术标签:

【中文标题】转义正则表达式字符串【英文标题】:Escaping regex string 【发布时间】:2010-09-21 18:43:46 【问题描述】:

我想使用来自用户的输入作为搜索某些文本的正则表达式模式。它有效,但我如何处理用户在正则表达式中放入有意义的字符的情况?

例如,用户想要搜索 Word (s):正则表达式引擎会将 (s) 作为一个组。我希望它像字符串"(s)" 一样对待它。我可以在用户输入上运行replace,并将( 替换为\(,将) 替换为\),但问题是我需要替换所有可能的正则表达式符号。

你知道更好的方法吗?

【问题讨论】:

【参考方案1】:

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

4.2.3 re Module Contents

转义(字符串)

返回所有非字母数字反斜杠的字符串;如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这将非常有用。

一个简单的例子,搜索任何出现的提供的字符串(可选地后跟's',并返回匹配对象。

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

【讨论】:

【参考方案2】:

你可以使用re.escape():

重新转义(字符串) 返回所有非字母数字反斜杠的字符串;如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这将非常有用。

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

如果您使用的是 不是正则表达式语法的一部分。

如果您使用的是 = 3.3 的 Python 版本,这将转义非字母数字,它们 不是 正则表达式语法的一部分,除了 专门用于下划线(_)。

【讨论】:

【参考方案3】:

很遗憾,re.escape() 不适合替换字符串:

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

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

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

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

【讨论】:

repl 的参数 re.sub 是一个字符串,而不是一个正则表达式;首先应用re.escape 没有任何意义。 @tripleee 不正确,repl 参数不是简单的字符串,它是被解析的。例如,re.sub(r'(.)', r'\1', 'X') 将返回 X,而不是 \1 这是转义 repl 参数的相关问题:***.com/q/49943270/247696 3.3 版更改:“_”字符不再转义。在 3.7 版更改:Only characters that can have special meaning in a regular expression are escaped.(为什么花了这么长时间?)【参考方案4】:

请试一试:

\Q 和 \E 作为锚点

放置一个或条件来匹配一个完整的单词或正则表达式。

参考链接:How to match a whole word that includes special characters in regex

【讨论】:

以上是关于转义正则表达式字符串的主要内容,如果未能解决你的问题,请参考以下文章

转义正则表达式字符串

为啥正则表达式构造函数需要双重转义?

python 正则表达式之转义字符

正则表达式仅匹配未转义的特殊字符

正则表达式中必须转义哪些特殊字符?

正则表达式中必须转义哪些特殊字符?