首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >re.DOTALL和re.MULTILINE有什么区别?

re.DOTALL和re.MULTILINE有什么区别?
EN

Stack Overflow用户
提问于 2017-01-12 18:08:53
回答 2查看 17K关注 0票数 14

当在多行上匹配表达式时,我总是使用re.DOTALL,它工作正常。现在我偶然发现了re.MULTILINE字符串,看起来它也在做同样的事情。

re模块(没有使其更清晰,但值不同):

代码语言:javascript
复制
M = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
S = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline

SRE_FLAG_MULTILINE = 8 # treat target as multiline string
SRE_FLAG_DOTALL = 16 # treat target as a single string

那么,在用法上有什么不同,在哪些微妙的情况下,它可以返回不同的东西呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-12 18:12:00

他们很不一样。是的,两者都会影响换行符的处理方式,但它们会为不同的概念切换行为。

  • re.MULTILINE影响^$锚点匹配的位置。 没有开关,^$只分别在整个文本的开头和结尾匹配。使用该开关,它们还在换行符之前或之后匹配:导入re >>> re.search('foo$','foo\nbar')是None # no match True >>> re.search('foo$','foo\nbar',flags=re.MULTILINE) <_sre.SRE_Match对象;span=(0,3),match='foo'>
  • re.DOTALL影响.模式可以匹配的内容。 如果没有开关,.将匹配除换行符以外的任何字符。对于开关,换行符也是匹配的:re.search('foo.','foo\nbar')是非匹配的真>>> re.search(‘foo’.,'foo\nbar',flags=re.DOTALL) <_sre.SRE_Match对象;span=(0,4),match='foo\n'>
票数 31
EN

Stack Overflow用户

发布于 2017-01-12 18:12:06

它不是在做相同的事情,DOTALL也匹配换行符,而MULTILINE使^$能够在每一行上工作。

示例:

代码语言:javascript
复制
The quick brown fox 
jumps over the lazy dog.

在这里,.+将在没有DOTALL模式的情况下产生两个结果(第一行和第二行)。如果打开DOTALL,它就匹配整个短语。

代码语言:javascript
复制
The quick brown fox 
jumps over the lazy dog.

在这里,( ^\w+ )在MULTILINE模式下,将匹配两次,因为的每个行的开头都有一个单词字符。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41620093

复制
相关文章

相似问题

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