查找所有正则表达式匹配的索引?

Posted

技术标签:

【中文标题】查找所有正则表达式匹配的索引?【英文标题】:Find the indexes of all regex matches? 【发布时间】:2011-03-31 23:29:49 【问题描述】:

我正在解析其中可能包含任意数量的引号字符串的字符串(我正在解析代码,并试图避免 PLY)。我想知道是否引用了子字符串,并且我有子字符串索引。我最初的想法是使用 re 查找所有匹配项,然后找出它们所代表的索引范围。

似乎我应该将 re 与\"[^\"]+\"|'[^']+' 之类的正则表达式一起使用(我目前正在避免处理三重引号和此类字符串)。当我使用 findall() 时,我会得到一个匹配字符串的列表,这有点好,但我需要索引。

我的子字符串可能和c 一样简单,我需要弄清楚这个特定的c 是否真的被引用了。

【问题讨论】:

听起来这个工作不适合正则表达式。 【参考方案1】:

这就是你想要的:(source)

re.finditer(pattern, string[, flags]) 

返回一个迭代器产生 MatchObject 实例 字符串中 RE 模式的非重叠匹配。字符串是 从左到右扫描,并按找到的顺序返回匹配项。空的 匹配项包含在结果中,除非它们触及 另一场比赛。

然后您可以从 MatchObjects 中获取开始和结束位置。

例如

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)]

【讨论】:

请注意,您实际上可以使用m.span() 来获取(m.start(), m.end())(并且默认组参数为0,因此可以省略)。 太棒了。正是在寻找这个。 注意,这种情况下会失败:base_str = "GATATATGCATATACTT" sub_str = "ATAT",结果应该是[(1,5), (3, 7), (9, 13)] , 但结果是 [(1, 5), (9, 13)] @unionx: finditer(),根据文档,返回非重叠匹配。 一个much more recent example,使用2018语法【参考方案2】:

#获取所有出现的索引

S = input() # Source String 
k = input() # String to be searched
import re
pattern = re.compile(k)
r = pattern.search(S)
if not r: print("(-1, -1)")
while r:
    print("(0, 1)".format(r.start(), r.end() - 1))
    r = pattern.search(S,r.start() + 1)

【讨论】:

【参考方案3】:

这应该可以解决您的问题 模式=r"(?=(\"[^\"]+\"|'[^']+'))"

然后使用以下获取所有重叠索引,

indicesTuple=[(mObj.start(1),mObj.end(1)-1) for mObj in re.finditer(pattern,input)]

【讨论】:

以上是关于查找所有正则表达式匹配的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作将多个模式匹配到同一索引的python正则表达式

正则表达式查找所有匹配项,除了那些被字符包围的匹配项

从文件中读取索引“n”低于与给定正则表达式匹配的行的所有行

正则表达式 3 -- 查找

从 pandas 数据框列中查找所有正则表达式匹配项

JS中search查找某些内容,正则表达式|查找分隔的任何项