查找所有正则表达式匹配的索引?
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)]
【讨论】:
以上是关于查找所有正则表达式匹配的索引?的主要内容,如果未能解决你的问题,请参考以下文章