【问题标题】:Match literal string '\$'匹配文字字符串 '\$'
【发布时间】:2017-04-16 21:08:20
【问题描述】:

我正在尝试匹配文字字符串'\$'。我用反斜杠转义了 '\' 和 '$' 。当我转义模式中的反斜杠时,为什么不起作用?但是,如果我使用点,它就会起作用。

import re

print re.match('\$','\$')
print re.match('\\\$','\$')
print re.match('.\$','\$')

输出:

None
None
<_sre.SRE_Match object at 0x7fb89cef7b90>

有人能解释一下内部发生了什么吗?

【问题讨论】:

    标签: python regex python-2.7


    【解决方案1】:

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

    转义(字符串)

    返回所有非字母数字反斜杠的字符串;这很有用 如果您想匹配可能具有常规的任意文字字符串 表达式元字符。

    例如:

    import re
    val = re.escape('\$') # val = '\\\$'
    print re.match(val,'\$')
    

    它输出:

    <_sre.SRE_Match object; span=(0, 2), match='\\$'>
    

    这相当于@TigerhawkT3在他的answer中提到的。

    【讨论】:

    • 如何取消转义?
    【解决方案2】:

    不幸的是,您需要更多的反斜杠。您需要转义它们以表明它们是字符串中的文字并将它们放入表达式中,然后进一步转义它们以表明它们是文字而不是正则表达式特殊字符。这就是为什么原始字符串经常用于正则表达式的原因:反斜杠不会爆炸。

    >>> import re
    >>> print re.match('\$','\$')
    None
    >>> print re.match('\\\$','\$')
    None
    >>> print re.match('.\$','\$')
    <_sre.SRE_Match object at 0x01E1F800>
    >>> print re.match('\\\\\$','\$')
    <_sre.SRE_Match object at 0x01E1F800>
    >>> print re.match(r'\\\$','\$')
    <_sre.SRE_Match object at 0x01E1F800>
    

    【讨论】:

    • 小心点,你差点召唤了噬魂者巴尔
    • @wim - “几乎”?那么我应该更努力地反斜杠。
    【解决方案3】:

    在(非原始)字符串文字中,反斜杠是特殊的。这意味着 Python 解释器应该专门处理以下字符。例如"\n" 是一个长度为 1 的字符串,其中包含换行符。 "\$" 是单个字符的字符串,即美元符号。 "\\$" 是一个由两个字符组成的字符串:一个反斜杠和一个美元符号。

    在正则表达式中,反斜杠也表示后面的字符要特殊处理,但一般特殊含义不同。在正则表达式中,$ 匹配行尾,\$ 匹配美元符号,\\ 匹配单个反斜杠,\\$ 匹配行尾的反斜杠。

    因此,当您执行re.match('\$',s) 时,Python 解释器读取'\$' 以构造字符串对象$(即长度为1),然后将该字符串对象传递给re.match。使用re.match('\\$',s),Python 创建一个字符串对象\$(长度为2)并将该字符串对象传递给re.match

    要查看实际传递给re.match 的内容,只需打印即可。例如:

    pat = '\\$'
    print "pat :" + pat + ":"
    m = re.match(pat, s)
    

    人们通常使用原始字符串文字来避免反斜杠的双重含义。

    pat = r'\$' # same 2-character string as above
    

    【讨论】:

      【解决方案4】:
      r'string'
      

      原始字符串

      尝试注释你的正则表达式字符串

      这里是带和不带原始注释的相同 re's

      print( re.match(r'\\\$', '\$'))
      <_sre.SRE_Match object; span=(0, 2), match='\\$'>
      
      
      print( re.match('\\\$', '\$'))
      None
      

      这是python3,因为

      【讨论】:

      【解决方案5】:

      感谢以上回答。我添加这个答案是因为我们在上述答案中没有简短的总结。

      反斜杠\需要在python字符串和正则表达式引擎中进行转义。

      Python 字符串会将 2 \\ 转换为 1 \。并且正则表达式引擎将需要 2 个\\ 来匹配 1 个\

      所以要为正则表达式引擎提供 2 个\\ 以匹配 1 个\,我们必须在 python 字符串中使用 4 个\\\\

      \\\\ --> Python(字符串翻译) ---> \\ ---> 正则表达式引擎(翻译) ---> \

      【讨论】:

        【解决方案6】:

        你必须使用 .作为 。匹配除换行符以外的任何字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          相关资源
          最近更新 更多