python - Python 3.6 的 re 模块中 re.finditer() 函数和 re.DOTALL 标志的错误?
问题描述
当我在使用 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 是什么?
案例二
我用 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'
没有别的了。
解决方案
你的模式是
.*
这意味着“匹配零个或多个字符”;允许零宽度匹配。
在您的第一种情况下,m2
and m4
s 存在,因为模式在换行符处停止匹配,然后尝试从该位置(索引 3)开始查找新匹配项。没有字符匹配,但模式仍然允许它,因为它是.*
,因此第一个匹配有
span=(0, 3)
第二场比赛有
span=(3, 3)
在您的代码span=(7, 7)
中和代码中也发生了同样的事情。m4
DOTALL
听起来您只有在至少有一个字符时才想要匹配- 重复使用+
而不是*
:
re.finditer('.+', 'abc\n de')
推荐阅读
- javascript - D3 工具提示不起作用
- python - 在熊猫中找到两列之间的传递关系
- azureservicebus - Azure 服务总线上的开放端口
- vue.js - 将 jQuery 动画重写为 Vue.js
- java - 使用 oracle 作为数据库打包 Spring Boot 应用程序
- php - 每次我尝试使用 Swift 和 Alamofire 将数据发布到 MySQL 数据库时,数据显示为空?
- javascript - 从rest api获取数据并在html页面中以table的形式打印出来
- logstash - Logstash 中的 Grok 模式格式
- c# - 如何在c#中将动态文本从英语翻译成西班牙语
- mysql - 如何最小化sql查询