如何找到所有正则匹配的索引?
我正在解析一些字符串,这些字符串里面可能包含任意数量的带引号的子字符串(我在解析代码,想避免使用PLY)。我想知道一个子字符串是否被引号包围,而我已经知道了这个子字符串的索引位置。最开始我想用正则表达式(re)来找到所有匹配的内容,然后再确定它们代表的索引范围。
我觉得可以用正则表达式来匹配,比如 \"[^\"]+\"|'[^']+'
(目前我不想处理三重引号之类的字符串)。当我使用findall()时,我得到了一个匹配字符串的列表,这样虽然不错,但我需要的是索引。
我的子字符串可能很简单,比如 c
,我需要确定这个特定的 c
是否真的被引号包围。
3 个回答
1
这段代码应该能解决你的问题:
pattern=r"(?=(\"[^\"]+\"|'[^']+'))"
接下来,使用下面的代码来获取所有重叠的索引:
indicesTuple = [(mObj.start(1),mObj.end(1)-1) for mObj in re.finditer(pattern,input)]
6
要获取所有出现位置的索引:
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)
237
这就是你想要的内容:(来源)
re.finditer(pattern, string[, flags])
这个方法会返回一个迭代器,它会生成 MatchObject 实例,这些实例代表了字符串中所有不重叠的正则表达式匹配结果。这个字符串是从左到右扫描的,匹配结果会按照找到的顺序返回。空匹配也会被包含在结果中,前提是它们不和其他匹配的开头重叠。
你可以从这些 MatchObject 中获取匹配的起始和结束位置。
例如:
[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)]