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

xit*_*ium 58 python regex

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

看起来我应该像正则表达式一样使用re \"[^\"]+\"|'[^']+'(我现在避免处理三重引号和此类字符串).当我使用findall()时,我得到了匹配字符串的列表,这有点不错,但我需要索引.

我的子字符串可能很简单c,我需要弄清楚这个特殊字符c是否实际被引用.

Dav*_*rby 131

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

re.finditer(pattern, string[, flags]) 
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以从MatchObjects获取开始和结束位置.

例如

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您实际上可以使用`m.span()`来获取`(m.start(),m.end())`(并且默认组参数为'0`,因此可以省略). (33认同)
  • 注意,在这种情况下它失败了:base_str = "GATATATGCATATACTT" sub_str = "ATAT",结果应该是 [(1,5), (3, 7), (9, 13)],但结果是 [(1 , 5), (9, 13)] (5认同)
  • @unionx:finditer(),根据文档,返回不重叠的匹配。 (3认同)
  • 如果您想要重叠匹配:http://stackoverflow.com/a/18966891/2300708 (3认同)
  • 一个[最近的例子](https://www.tutorialspoint.com/How-do-we-use-re-finditer-method-in-Python-regular-expression),使用 2018 年语法 (2认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)