首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >finditer和findall跳过子串

finditer和findall跳过子串
EN

Stack Overflow用户
提问于 2021-02-15 13:37:31
回答 2查看 65关注 0票数 0

我正在试图找到例如p='gg's='ggggg'中出现的所有情况。根据我的计数,应该有4,因为除最后一个位置之外的任何位置都是一个子字符串。例如,s[1:2]'gg'。然而,这两个方面都在努力:

代码语言:javascript
复制
>re.findall('gg','ggggg')
['gg','gg']
>list(re.finditer('gg','ggggg'))
[<_sre.SRE_Match object; span=(0, 2), match='ab'>,
 <_sre.SRE_Match object; span=(6, 8), match='gg'>,
 <_sre.SRE_Match object; span=(8, 10), match='gg'>]

似乎是跳过潜在的匹配,一旦它找到一些匹配。因此,搜索例如“星星”或“开始”就相当于寻找开始,因为我永远找不到第二个,因为第一个是它的前缀.

这是个虫子吗?如何执行完整的子字符串搜索?

例2:

代码语言:javascript
复制
>re.findall('star|start','starting')
['star']
>list(re.finditer('star|start','starting'))
[<_sre.SRE_Match object; span=(0, 4), match='star'>]

(我正在使用Python 3,re version 2.2.1)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-15 13:44:29

代码语言:javascript
复制
import re
re.findall('gg','ggggg')

结果是两个匹配,因为re.findall不寻找重叠匹配,或者再文档

返回字符串中所有不重叠的模式匹配,作为字符串列表。

因此,这不是一个bug,而是符合文档的行为。

如果允许使用外部模块,则可以通过以下方式利用regex

代码语言:javascript
复制
import regex
print(re.findall('gg', 'ggggg', overlapped=True))

产出:

代码语言:javascript
复制
['gg', 'gg', 'gg', 'gg']
票数 3
EN

Stack Overflow用户

发布于 2021-02-15 13:44:11

您可能搜索的关键字是“重叠”。下面是一个链接的问题具有重叠现象的字符串计数

来自回复文档。

non-overlapping:返回字符串中模式的所有find_all匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,则这将是一个元组列表。结果中包含空匹配。

这似乎是一个特性,而不是一个bug。

您可以实现自己的搜索功能,例如:

代码语言:javascript
复制
def my_search(s, substr):
    for i in len(s):
        if s[i:].startswith(substr):
            yield i
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66209100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档