re.search 如何匹配原始字符串?
How does re.search match raw strings?
re.search(r'c\.t', 'c.t abc')
成功匹配到 c.t
。但是匹配的模式是c\.t
,c.t
如何匹配到c\.t
?反斜杠怎么了?
在正则表达式中,点字符有一个特殊的含义,它可以匹配除换行符之外的任何字符(除非使用 re.S
/re.DOTALL
标志) .在这种情况下,反斜杠具有将点从其特殊含义转义并让正则表达式引擎将其解释为仅匹配一个点(而不是其他字符)的字面效果。考虑是否没有反斜杠:
>>> re.search(r'c.t', 'c.t abc')
<_sre.SRE_Match object at 0x7fe7378d8370>
您作为输入提供的原始字符串仍然匹配。但现在以下也将匹配:
>>> re.search(r'c.t', 'I saw a cat')
<_sre.SRE_Match object at 0x7fe7378d83d8>
因为 cat
中的 a
符合任何非换行符的条件,如果未使用反斜杠转义,则 .
将匹配该字符。你可以看到,如果我们重新添加反斜杠,它就不再匹配了。
>>> print(re.search(r'c\.t', 'I saw a cat'))
None
有关 Python 正则表达式实现的更多信息,请点击此处:
Python 2.7.x: https://docs.python.org/2/library/re.html
Python 3.4.x: https://docs.python.org/3/library/re.html
编辑以反映@cdarke 关于换行的极好的观点
re.search(r'c\.t', 'c.t abc')
成功匹配到 c.t
。但是匹配的模式是c\.t
,c.t
如何匹配到c\.t
?反斜杠怎么了?
在正则表达式中,点字符有一个特殊的含义,它可以匹配除换行符之外的任何字符(除非使用 re.S
/re.DOTALL
标志) .在这种情况下,反斜杠具有将点从其特殊含义转义并让正则表达式引擎将其解释为仅匹配一个点(而不是其他字符)的字面效果。考虑是否没有反斜杠:
>>> re.search(r'c.t', 'c.t abc')
<_sre.SRE_Match object at 0x7fe7378d8370>
您作为输入提供的原始字符串仍然匹配。但现在以下也将匹配:
>>> re.search(r'c.t', 'I saw a cat')
<_sre.SRE_Match object at 0x7fe7378d83d8>
因为 cat
中的 a
符合任何非换行符的条件,如果未使用反斜杠转义,则 .
将匹配该字符。你可以看到,如果我们重新添加反斜杠,它就不再匹配了。
>>> print(re.search(r'c\.t', 'I saw a cat'))
None
有关 Python 正则表达式实现的更多信息,请点击此处:
Python 2.7.x: https://docs.python.org/2/library/re.html
Python 3.4.x: https://docs.python.org/3/library/re.html
编辑以反映@cdarke 关于换行的极好的观点