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


76

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

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

我的子字符串可能和一样简单c,因此我需要弄清楚是否c确实引用了该特定字符串。


听起来像这项工作不适合正则表达式。
Daniel Kluev 2010年

Answers:


158

这就是您想要的:(

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

返回一个迭代器,该迭代器在字符串的RE模式的所有非重叠匹配中产生MatchObject实例。从左到右扫描字符串,并以找到的顺序返回匹配项。空匹配项将包括在结果中,除非它们碰到另一个匹配项的开头。

然后,您可以从MatchObjects获取起点和终点。

例如

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

40
请注意,您实际上可以使用m.span()get (m.start(), m.end())(默认的group参数为0,因此可以省略)。
琥珀

1
辉煌。正是在寻找这个。
armandino

3
注意,在这种情况下它将失败:base_str =“ GATATATGCATATACTT” sub_str =“ ATAT”,结果应为[(1,5),(3、7),(9、13)],但结果为[(1 ,5),(
9,13

2
@unionx:根据文档,finditer()返回不重叠的匹配项。
塔利亚

1
一个更近的例子,与2018语法
弥敦道

0

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

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

indexeTuple = [(re.finditer(pattern,input)中mObj的((mObj.start(1),mObj.end(1)-1))]


0

#获取所有事件的索引

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.