首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex:不匹配以换行符(\n)结尾的字符串和行尾锚($)

Regex:不匹配以换行符(\n)结尾的字符串和行尾锚($)
EN

Stack Overflow用户
提问于 2018-02-11 10:02:32
回答 3查看 8.6K关注 0票数 9

我不知道如何匹配字符串,但不知道字符串是否有一个尾尾换行符(\n),这似乎是自动删除的:

代码语言:javascript
复制
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

我遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-11 10:43:11

你更可能不需要$,而需要\Z

代码语言:javascript
复制
>>> print(re.match(r'^foobar\Z', 'foobar\n'))
None
  • \Z只匹配字符串的末尾。
票数 12
EN

Stack Overflow用户

发布于 2018-02-11 10:10:50

文档$字符这么说:

匹配字符串的末尾或在字符串末尾的换行符之前,并且在多行模式下也在换行符之前匹配。

因此,如果不使用MULTILINE选项,它将与您尝试的前两个字符串完全匹配:'foobar''foobar\n',而不是'foobar\n\n',因为这不是字符串末尾的换行符。

另一方面,如果您选择MULTILINE选项,它将匹配任何行的末尾:

代码语言:javascript
复制
>>> re.match(r'^foobar$', 'foobar\n\n', re.MULTILINE)
<_sre.SRE_Match object; span=(0, 6), match='foobar'>

当然,在以下情况下,这也会匹配,这可能是您想要的,也可能不是您想要的:

代码语言:javascript
复制
>>> re.match(r'^foobar$', 'foobar\nanother line\n', re.MULTILINE)
<_sre.SRE_Match object; span=(0, 6), match='foobar'>

为了不匹配结束换行符,正如DeepSpace所写的那样,使用消极的前瞻性

票数 3
EN

Stack Overflow用户

发布于 2018-02-11 10:09:48

这是$的定义行为,可以在@zvone链接到甚至在https://regex101.com上的文档中读取:

$断言字符串末尾的位置,或字符串末尾行终止符之前的位置(如果有的话)

您可以使用显式的负面展望来对付这种行为:

代码语言:javascript
复制
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'))
# None
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48730327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档