【发布时间】:2010-09-21 18:43:46
【问题描述】:
我想使用来自用户的输入作为搜索某些文本的正则表达式模式。它有效,但我如何处理用户在正则表达式中放入有意义的字符的情况?
例如,用户想要搜索 Word (s):正则表达式引擎会将(s) 作为一个组。我希望它像字符串"(s)" 一样对待它。我可以在用户输入上运行replace,并将( 替换为\(,将) 替换为\),但问题是我需要替换所有可能的正则表达式符号。
你知道更好的方法吗?
【问题讨论】:
我想使用来自用户的输入作为搜索某些文本的正则表达式模式。它有效,但我如何处理用户在正则表达式中放入有意义的字符的情况?
例如,用户想要搜索 Word (s):正则表达式引擎会将(s) 作为一个组。我希望它像字符串"(s)" 一样对待它。我可以在用户输入上运行replace,并将( 替换为\(,将) 替换为\),但问题是我需要替换所有可能的正则表达式符号。
你知道更好的方法吗?
【问题讨论】:
为此使用re.escape() 函数:
转义(字符串)
返回所有非字母数字反斜杠的字符串;如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这将非常有用。
一个简单的例子,搜索任何出现的提供的字符串(可选地后跟's',并返回匹配对象。
def simplistic_plural(word, text):
word_or_plural = re.escape(word) + 's?'
return re.match(word_or_plural, text)
【讨论】:
你可以使用re.escape():
重新转义(字符串) 返回所有非字母数字反斜杠的字符串;如果您想匹配其中可能包含正则表达式元字符的任意文字字符串,这将非常有用。
>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'
如果您使用的是 不是正则表达式语法的一部分。
如果您使用的是 = 3.3 的 Python 版本,这将转义非字母数字,它们 不是 正则表达式语法的一部分,除了 专门用于下划线(_)。
【讨论】:
很遗憾,re.escape() 不适合替换字符串:
>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'
一种解决方案是将替换放在 lambda 中:
>>> re.sub('a', lambda _: '_', 'aa')
'__'
因为 lambda 的返回值被 re.sub() 视为文字字符串。
【讨论】:
repl 的参数 re.sub 是一个字符串,而不是一个正则表达式;首先应用re.escape 没有任何意义。
repl 参数不是简单的字符串,它是被解析的。例如,re.sub(r'(.)', r'\1', 'X') 将返回 X,而不是 \1。
repl 参数的相关问题:stackoverflow.com/q/49943270/247696
请试一试:
\Q 和 \E 作为锚点
放置一个或条件来匹配一个完整的单词或正则表达式。
参考链接:How to match a whole word that includes special characters in regex
【讨论】: