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

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

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

你知道更好的方法吗?

【问题讨论】:

    标签: python regex


    【解决方案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() 视为文字字符串。

        【讨论】:

        【解决方案4】:

        请试一试:

        \Q 和 \E 作为锚点

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

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

        【讨论】:

          猜你喜欢
          • 2011-10-13
          • 2017-09-08
          相关资源
          最近更新 更多