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

Mic*_*elT 211 python regex

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

dda*_*daa 295

使用此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)
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这有这么多赞成票。它没有解释为什么或何时我们想要使用转义...甚至没有提到为什么原始字符串是相关的,恕我直言,这对于理解何时使用它很重要。 (3认同)

gim*_*mel 51

你可以使用re.escape():

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

>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'
Run Code Online (Sandbox Code Playgroud)


Owe*_*wen 5

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

>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'
Run Code Online (Sandbox Code Playgroud)

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

>>> re.sub('a', lambda _: '_', 'aa')
'__'
Run Code Online (Sandbox Code Playgroud)

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

  • @tripleee 那是不正确的,`repl` 参数不是一个简单的字符串,它被解析。例如,`re.sub(r'(.)', r'\1', 'X')` 将返回 `X`,而不是 `\1`。 (5认同)
  • 这是转义 `repl` 参数的相关问题:/sf/ask/3496028931/ (5认同)
  • 在 3.3 版更改: '_' 字符不再转义。在 3.7 版更改:[只有在正则表达式中具有特殊含义的字符才会被转义。](https://docs.python.org/3/library/re.html#re.escape)(为什么要这样长?) (5认同)
  • `re.sub` 的 `repl` 参数是一个字符串,而不是一个正则表达式;对它应用 `re.escape` 一开始就没有任何意义。 (3认同)