python - 为什么我的积极前瞻断言会消耗字符串并且不正确匹配?
问题描述
我正在尝试查找字符串中子字符串的所有出现,并使用正则表达式打印它们的开始和结束索引。
例如, string = 'bbbcbb' sub = 'bb' 我必须得到 (0,1) (1,2) (4,5) 作为我的输出。
我的代码:
import re
matches = list(re.finditer(r'bb(?=[a-zA-Z]|$)', 'bbbcbb'))
输出:
[<_sre.SRE_Match object; span=(0, 2), match='bb'>,
<_sre.SRE_Match object;span=(4, 6), match='bb'>]
我浏览了https://docs.python.org/3/library/re.html上的文档,据我了解,前瞻断言将通过
- 在位置 0,它将匹配 'bb' 与 "bb" 后跟 "b" .ie bb bcbb
- 在位置 1,它将匹配 'bb' 与 "bb" 后跟 "c" .ie b bb cbb
- 然后它将不匹配,直到位置 4 它将匹配 'bb' 与 "bb" 后跟 $ .ie bbbc bb
为什么前瞻断言忽略了 (1,3) 位置的 b'bb'cbb?还是我对前瞻断言的理解有缺陷?
解决方案
该模式'bb(?=[a-zA-Z]|$)
将匹配 2 个字符而不是 1 个,断言右侧是字符 az 或字符串的结尾。
使用re.finditer,您可能会更新您的模式以匹配一个单一的b
并将一个单一b
的放在积极的前瞻中:
import re
matches = list(re.finditer(r'b(?=b)', 'bbbcbb'))
for m in matches:
print(m.span())
结果
(0, 1)
(1, 2)
(4, 5)
推荐阅读
- css - CSS - 选择所有类以前缀开头的元素
- python - 使用 google/protobuf/empty.proto 在没有参数的情况下调用 python grpc 方法期间的 TypeError
- react-native - 在 ios 上的 react-native-share 中,我们需要知道为什么共享选项弹出屏幕会立即被关闭?
- c - 内联和标题守卫之间的区别
- javascript - 如何将文件或文件夹移动到 google drive api 中的另一个文件夹?
- c++ - 如何在不同的 QThreads 中运行函数
- reactjs - 当另一个字段被更改时,Ant 设计表单会更新一个字段
- c++ - C++ 指针的引用可以为空吗?
- list - Haskell - 附加到列表列表中的列表并返回更新的列表列表
- numpy - 我正在使用掩码对 numpy 数组进行切片,但输出被展平。如何保留列数?