re.DOTALL 的 finditer 从 span=(16,17) 开始分析。为什么?
finditer with re.DOTALL starts analysis from span=(16,17). Why?
我正在尝试将文本文件分解为具有 findall 排序或操作的部分。
我需要反向引用,所以我选择了 finditer。
由于我正在处理多行文本文件 - 我需要 re.DOTALL。只要匹配不是从前 16 个字符开始,它就可以正常工作。
(过度)简化的问题示例:
r=re.compile(r'[0-9]')
[print(i) for i in r.finditer('01234567890123456789',re.DOTALL)]
输出为:
<re.Match object; span=(16, 17), match='6'>
<re.Match object; span=(17, 18), match='7'>
<re.Match object; span=(18, 19), match='8'>
<re.Match object; span=(19, 20), match='9'>
[None, None, None, None]
我预计会有 20 场比赛,而不是 4 场。
我想我可以用 re.MULTILINE 实现我的 objective,但我想保持对 python 的信念 and/or 我对它们的理解。
请指教
康拉德
你所做的是我们中最好的人都会遇到的事情,所以保证不要用头撞墙?
re.DOTALL
是正确的,但它不是您想要的函数的参数。你需要把它放在编译函数中,像这样:
r=re.compile(r'[0-9]', re.DOTALL)
趣闻:整数格式的 re.DOTALL 的值为 16
。想猜猜为什么忽略输入的前 16 个匹配项?
那是因为 re.DOTALL
是一个值为 16 的整数。
print(isinstance(re.DOTALL, int)) # True
print(re.DOTALL) # <RegexFlag.DOTALL: 16>
re.finditer
的第二个参数是要搜索的起始索引。编译 Regex 模式时应该传递标志,因此以下
pattern = re.compile(r'[0-9]', re.DOTALL)
for match in pattern.finditer('01234567890123456789'):
print(match)
会 运行 符合预期。
我正在尝试将文本文件分解为具有 findall 排序或操作的部分。 我需要反向引用,所以我选择了 finditer。 由于我正在处理多行文本文件 - 我需要 re.DOTALL。只要匹配不是从前 16 个字符开始,它就可以正常工作。 (过度)简化的问题示例:
r=re.compile(r'[0-9]')
[print(i) for i in r.finditer('01234567890123456789',re.DOTALL)]
输出为:
<re.Match object; span=(16, 17), match='6'>
<re.Match object; span=(17, 18), match='7'>
<re.Match object; span=(18, 19), match='8'>
<re.Match object; span=(19, 20), match='9'>
[None, None, None, None]
我预计会有 20 场比赛,而不是 4 场。 我想我可以用 re.MULTILINE 实现我的 objective,但我想保持对 python 的信念 and/or 我对它们的理解。 请指教
康拉德
你所做的是我们中最好的人都会遇到的事情,所以保证不要用头撞墙?
re.DOTALL
是正确的,但它不是您想要的函数的参数。你需要把它放在编译函数中,像这样:
r=re.compile(r'[0-9]', re.DOTALL)
趣闻:整数格式的 re.DOTALL 的值为 16
。想猜猜为什么忽略输入的前 16 个匹配项?
那是因为 re.DOTALL
是一个值为 16 的整数。
print(isinstance(re.DOTALL, int)) # True
print(re.DOTALL) # <RegexFlag.DOTALL: 16>
re.finditer
的第二个参数是要搜索的起始索引。编译 Regex 模式时应该传递标志,因此以下
pattern = re.compile(r'[0-9]', re.DOTALL)
for match in pattern.finditer('01234567890123456789'):
print(match)
会 运行 符合预期。