【问题标题】:Bug with re.finditer() function and re.DOTALL flag in re module of Python 3.6? [duplicate]Python 3.6 的 re 模块中 re.finditer() 函数和 re.DOTALL 标志的错误? [复制]
【发布时间】:2023-03-14 11:09:01
【问题描述】:

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

案例 1

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

我希望得到 2 个匹配的值: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 de'

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'

仅此而已。

【问题讨论】:

  • 如果您不想匹配空字符串,请使用.+ 而不是.*

标签: python regex pattern-matching newline flags


【解决方案1】:

你的模式是

.*

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

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

span=(0, 3)

第二场比赛有

span=(3, 3)

span=(7, 7)m4 和您的DOTALL 代码中也发生了同样的事情。

听起来您只需要 至少一个字符 进行匹配 - 重复使用 + 而不是 *

re.finditer('.+', 'abc\n de')

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2013-12-23
    • 1970-01-01
    • 2017-08-31
    • 2016-03-31
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多