首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python3.6的re模块中带有re.finditer()函数和re.DOTALL标志的Bug?

在Python3.6的re模块中带有re.finditer()函数和re.DOTALL标志的Bug?
EN

Stack Overflow用户
提问于 2019-01-03 02:55:07
回答 1查看 732关注 0票数 0

在使用Python3.6时,我在re.DOTALL ()中使用re.finditer()时会得到奇怪的结果。我不知道这是预期的操作,还是遗漏了什么,或者是错误。

案例1

我尝试使用这个版本的带有嵌入换行符的字符串。

我希望得到两个匹配的值: m1 = 'abc‘和m2 =’de‘

代码语言:javascript
复制
import re
result = re.finditer('.*', 'abc\n de', flags=0)
m1 = result.__next__()
#    <_sre.SRE_Match object; span=(0, 3), match='abc'>
m2 = result.__next__()
#    <_sre.SRE_Match object; span=(3, 3), match=''>
m3 = result.__next__()
#    <_sre.SRE_Match object; span=(4, 7), match=' de'>
m4 = result.__next__()
#    <_sre.SRE_Match object; span=(7, 7), match=''>

匹配值m2和m4是什么?

案例2

我用re.DOTALL来尝试这个,我希望能得到一个匹配,m1 = 'abc\n‘。

代码语言:javascript
复制
result = re.finditer('.*', 'abc\n de', flags=re.DOTALL)
m1 = result.__next__()
#     <_sre.SRE_Match object; span=(0, 7), match='abc\n de'>
m2 = result.__next__()
#     <_sre.SRE_Match object; span=(7, 7), match=''>

额外的火柴是怎么回事?如何使结果如预期的那样工作?

我要第一个案子回来..。

代码语言:javascript
复制
m1 = 'abc'
m2 = ' de'

..。还有第二个要回去的案子

代码语言:javascript
复制
m1 = 'abc\n de'

没别的事了。

EN

回答 1

Stack Overflow用户

发布于 2019-01-03 03:01:40

你的模式是

代码语言:javascript
复制
.*

这意味着“匹配零或多个字符”;零宽度匹配是允许的。

在第一个例子中,m2m4的存在是因为模式在换行符处停止匹配,然后尝试从那个位置(索引3)找到一个新的匹配。没有匹配字符,但模式仍然允许匹配,因为它是.*,因此第一次匹配

代码语言:javascript
复制
span=(0, 3)

第二场比赛

代码语言:javascript
复制
span=(3, 3)

同样的情况也发生在span=(7, 7)中的m4DOTALL代码中。

听起来,只有在至少有一个字符重复( +而不是* )的情况下,才需要匹配

代码语言:javascript
复制
re.finditer('.+', 'abc\n de')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54015743

复制
相关文章

相似问题

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