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

vdgimpew  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(191)

我正在解析字符串,这些字符串中可能包含任意数量的带引号的字符串(我正在解析代码,并试图避免使用PLY)。我想找出一个子字符串是否带引号,并得到子字符串的索引。我最初的想法是使用re来查找所有匹配项,然后找出它们所代表的索引范围。
看起来我应该在\"[^\"]+\"|'[^']+'这样的正则表达式中使用re(我现在避免处理三重引号之类的字符串)。当我使用findall()时,我得到了一个匹配字符串的列表,这有点不错,但我需要索引。
我的子字符串可能像c一样简单,我需要弄清楚这个特定的c是否真的被引用了。

yh2wf1be

yh2wf1be1#

这就是你想要的:(来源)

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

返回一个迭代器,该迭代器在字符串中RE模式的所有非重叠匹配项上生成MatchObject示例。从左到右扫描字符串,并按找到的顺序返回匹配项。结果中包括空匹配项,除非它们接触到另一个匹配项的开头。
然后,您可以从MatchObjects取得开始和结束位置。
例如:

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

u0njafvf2#

要获取所有示例的索引:

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)
j5fpnvbx

j5fpnvbx3#

这应该可以解决您的问题:

pattern=r"(?=(\"[^\"]+\"|'[^']+'))"

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

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

相关问题