【问题标题】:strange python regex: not able to find match奇怪的python正则表达式:找不到匹配项
【发布时间】:2022-10-07 07:43:33
【问题描述】:

我面临一些奇怪的 python 正则表达式问题。以下两个字符串应该是完全相同的。但不知何故,它们不匹配。

import re
print(\" \\\\\\\"\")
print(\" \"+chr(92)+chr(34)+\"\")
print(re.search(\" \\\\\\\"\", \" \"+chr(92)+chr(34)+\"\"))

但是,以下确实匹配

import re
print(\"\\\\\\\"\")
print(\"\"+chr(92)+chr(34)+\"\")
print(re.search(\"\\\\\\\"\", \"\"+chr(92)+chr(34)+\"\"))

对这里发生的事情有任何想法吗?

    标签: python regex


    【解决方案1】:

    问题是反斜杠字符对 python 中的字符串具有特殊含义。您可以使用通过在字符串文字前加上“r”或“R”来创建的 Python 原始字符串,其中 Python 原始字符串将反斜杠 (\) 视为文字字符。

    import re
    print(" \\\"")
    print(" "+chr(92)+chr(34)+"")
    print(re.search(r" \\\"", " "+chr(92)+chr(34)+""))
    

    输出:

     \"
     \"
    <re.Match object; span=(0, 3), match=' \\"'>
    

    在第二个示例中 print(re.search("\\\"", ""+chr(92)+chr(34)+"")) 输出: &lt;re.Match object; span=(1, 2), match='"'&gt; 仅匹配双引号。

    需要转义反斜杠或使用原始字符串。如果在正则表达式周围使用单引号,则不需要转义双引号。

    s = "" + chr(92) + chr(34) + ""
    print(re.search("\\\\\"", s))
    print(re.search(r"\\\"", s))
    print(re.search(r'\\"', s))
    

    输出:

    <re.Match object; span=(0, 2), match='\\"'>
    <re.Match object; span=(0, 2), match='\\"'>
    <re.Match object; span=(0, 2), match='\\"'>
    

    有关 Python 中原始字符串和反斜杠的更多详细信息,请参阅question 的答案。

    【讨论】:

    • 为什么第二个案例通过了?
    • 注意第二种情况&lt;re.Match object; span=(1, 2), match='"'&gt; 的匹配输出,它只匹配单引号。
    • 所以当 \ 没有什么可以逃脱时,它就被扔掉了?
    • 如果想将 \ 匹配为文字,则需要 print(re.search("\\\\\"", ""+chr(92)+chr(34)+""))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2017-10-11
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多