我正在解析其中可能包含任意数量的引用字符串的字符串(我正在解析代码,并试图避免PLY)。我想知道是否引用了子字符串,并且我有子字符串索引。我最初的想法是使用re来查找所有匹配项,然后找出它们所代表的索引范围。
似乎我应该使用re和\"[^\"]+\"|'[^']+'
这样的正则表达式(我现在避免处理三重引号和这样的字符串)。当我使用findall()时,我得到一个匹配字符串的列表,这有点不错,但我需要索引。
我的子字符串可能就像c
一样简单,我需要弄清楚这个特定的c
是否实际被引用。
答案 0 :(得分:115)
这就是你想要的:(source)
re.finditer(pattern, string[, flags])
返回一个迭代器,在所有上面生成MatchObject实例 字符串中RE模式的非重叠匹配。字符串是 从左到右扫描,并按找到的顺序返回匹配。空 匹配包含在结果中,除非它们触及开头 另一场比赛。
然后,您可以从MatchObjects获取开始和结束位置。
e.g。
[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)]
答案 1 :(得分:0)
这应该可以解决您的问题 pattern = r“(?=(\” [^ \“] + \” |'[[^'] +'))“
然后使用以下命令获取所有重叠的索引,
indicesTuple = [(re.finditer(pattern,input)中mObj的((mObj.start(1),mObj.end(1)-1))
答案 2 :(得分: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)