转义正则表达式字符串
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
【讨论】:
以上是关于转义正则表达式字符串的主要内容,如果未能解决你的问题,请参考以下文章