我不知道如何匹配字符串,但不知道字符串是否有一个尾尾换行符(\n),这似乎是自动删除的:
import re
print(re.match(r'^foobar$', 'foobar'))
# <_sre.SRE_Match object; span=(0, 6), match='foobar'>
print(re.match(r'^foobar$', 'foobar\n'))
# <_sre.SRE_Match object; span=(0, 6), match='foobar'>
print(re.match(r'^foobar$', 'foobar\n\n'))
# None对我来说,第二种情况也应该返回None。
当我们用$ (如^foobar$ )设置模式的末尾时,它应该只匹配像foobar这样的字符串,而不是foobar\n。
我遗漏了什么?
发布于 2018-02-11 10:43:11
你更可能不需要$,而需要\Z
>>> print(re.match(r'^foobar\Z', 'foobar\n'))
None\Z只匹配字符串的末尾。发布于 2018-02-11 10:10:50
文档对$字符这么说:
匹配字符串的末尾或在字符串末尾的换行符之前,并且在多行模式下也在换行符之前匹配。
因此,如果不使用MULTILINE选项,它将与您尝试的前两个字符串完全匹配:'foobar'和'foobar\n',而不是'foobar\n\n',因为这不是字符串末尾的换行符。
另一方面,如果您选择MULTILINE选项,它将匹配任何行的末尾:
>>> re.match(r'^foobar$', 'foobar\n\n', re.MULTILINE)
<_sre.SRE_Match object; span=(0, 6), match='foobar'>当然,在以下情况下,这也会匹配,这可能是您想要的,也可能不是您想要的:
>>> re.match(r'^foobar$', 'foobar\nanother line\n', re.MULTILINE)
<_sre.SRE_Match object; span=(0, 6), match='foobar'>为了不匹配结束换行符,正如DeepSpace所写的那样,使用消极的前瞻性。
发布于 2018-02-11 10:09:48
这是$的定义行为,可以在@zvone链接到甚至在https://regex101.com上的文档中读取:
$断言字符串末尾的位置,或字符串末尾行终止符之前的位置(如果有的话)
您可以使用显式的负面展望来对付这种行为:
import re
print(re.match(r'^foobar(?!\n)$', 'foobar'))
# <_sre.SRE_Match object; span=(0, 6), match='foobar'>
print(re.match(r'^foobar(?!\n)$', 'foobar\n'))
# None
print(re.match(r'^foobar(?!\n)$', 'foobar\n\n'))
# Nonehttps://stackoverflow.com/questions/48730327
复制相似问题