Python - 如何在正则表达式中获取重叠的文本匹配

3
我正在使用以下内容来获取所有匹配项,包括重叠部分,根据推荐以及其他线程的建议
[(m.start(0), m.end(0)) for m in re.findall(t,s,overlapped = True)]

t是s的子集。但我收到了以下错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: findall() got an unexpected keyword argument 'overlapped.'

我做错了什么/overlapped标志已经过时了吗/你会如何处理?非常感谢您的帮助。

4
你想要匹配什么?同时,overlapped=True 是外部库 regex 的一部分,与 Python 的 re 库不兼容。 - Padraic Cunningham
1
这篇文章提到了正则表达式模块的新版本,你需要先安装它。 - Klaus D.
同时,你所提供的第一个线程的第一个答案似乎可以在不使用任何额外库的情况下实现你想要的功能。 - SBH
2
尝试使用import regex as re - user557597
1个回答

3
如Cunningham和Klaus所提到的,我所提到的标志来自一个不是re的不同包。然而,我通过使用前瞻找到了一种不需要下载外部包的解决方案。
[(m.start(0), m.end(0)) for m in re.finditer('(?='+t+')',s)]

当 s = 'GATATATGCATATACTT' 且 t = 'ATAT' 时,您将得到 [(1, 1), (3, 3), (9, 9)]。我不需要返回匹配文本,只需返回索引即可,因此如果匹配 ['','',''],也无关紧要。

你是指我在这里使用的import包regex还是re?我知道如何编辑包。 - user1764359
@sln它能够工作是因为表达式实际上匹配的是“”,每个都不重叠。 - user1764359
不,@PadraicCunningham,在我的代码中我抛弃了 m.end(0) 并使用了 ' '.join(comprehension) - user1764359
1
实际上它确实匹配 (?=pattern),只是不会消耗它。因此,您可能认为匹配位置在匹配之间不会改变,但实际上它会在下一次匹配开始之前提前 1 个字符位置。这样做是为了避免无限循环。这被称为“bump along”。我认为所有引擎都会这样做。更安全的方法是通过 (?=pattern) 强制进行匹配。 - user557597
@sln 我觉得我理解了,但你的描述方式肯定更好。感谢你详细的解释。 - user1764359
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接