在使用Python3.6时,我在re.DOTALL ()中使用re.finditer()时会得到奇怪的结果。我不知道这是预期的操作,还是遗漏了什么,或者是错误。
案例1
我尝试使用这个版本的带有嵌入换行符的字符串。
我希望得到两个匹配的值: m1 = 'abc‘和m2 =’de‘
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‘。
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=''>额外的火柴是怎么回事?如何使结果如预期的那样工作?
我要第一个案子回来..。
m1 = 'abc'
m2 = ' de'..。还有第二个要回去的案子
m1 = 'abc\n de'没别的事了。
发布于 2019-01-03 03:01:40
你的模式是
.*这意味着“匹配零或多个字符”;零宽度匹配是允许的。
在第一个例子中,m2和m4的存在是因为模式在换行符处停止匹配,然后尝试从那个位置(索引3)找到一个新的匹配。没有匹配字符,但模式仍然允许匹配,因为它是.*,因此第一次匹配
span=(0, 3)第二场比赛
span=(3, 3)同样的情况也发生在span=(7, 7)中的m4和DOTALL代码中。
听起来,只有在至少有一个字符重复( +而不是* )的情况下,才需要匹配
re.finditer('.+', 'abc\n de')https://stackoverflow.com/questions/54015743
复制相似问题