带有 re.finditer() 函数和 re.Python 3.6 重新模块中的 DOTALL 标志



当我使用re时,我得到了奇怪的结果。使用 Python 3.6 时的 re.finditer() 中的 DOTALL。我不知道这是预期的操作,还是我错过了什么,或者它是否是一个错误。

案例1

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

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

import re
result = re.finditer('.*', 'abcn 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 de'

result = re.finditer('.*', 'abcn de', flags=re.DOTALL)
m1 = result.__next__()
#     <_sre.SRE_Match object; span=(0, 7), match='abcn de'>
m2 = result.__next__()
#     <_sre.SRE_Match object; span=(7, 7), match=''>

额外的比赛是怎么回事?如何使结果按预期工作?

我希望第一个案例返回...

m1 = 'abc'
m2 = ' de'

。和第二个案例返回

m1 = 'abcn de'

仅此而已。

你的模式是

.*

这意味着"匹配零个或多个字符";允许零宽度匹配。

在第一种情况下,m2m4 存在,因为模式在换行符处停止匹配,然后尝试从该位置开始查找新匹配项(索引 3)。没有匹配字符,但模式仍然允许它,因为它是.*的,因此第一个匹配有

span=(0, 3)

第二场比赛有

span=(3, 3)

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

听起来只有当至少有一个字符时才想要匹配 - 重复+而不是*

re.finditer('.+', 'abcn de')

最新更新