【问题标题】:Find the indexes of all regex matches?查找所有正则表达式匹配的索引?
【发布时间】:2011-03-31 23:29:49
【问题描述】:

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

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

我的子字符串可能和c 一样简单,我需要弄清楚这个特定的c 是否真的被引用了。

【问题讨论】:

  • 听起来这个工作不适合正则表达式。

标签: python regex indexing


【解决方案1】:

这就是你想要的:(source)

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

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

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

例如

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

【讨论】:

  • 请注意,您实际上可以使用m.span() 来获取(m.start(), m.end())(并且默认组参数为0,因此可以省略)。
  • 太棒了。正是在寻找这个。
  • 注意,这种情况下会失败:base_str = "GATATATGCATATACTT" sub_str = "ATAT",结果应该是[(1,5), (3, 7), (9, 13)] , 但结果是 [(1, 5), (9, 13)]
  • @unionx: finditer(),根据文档,返回非重叠匹配。
  • 一个much more recent example,使用2018语法
【解决方案2】:

#获取所有出现的索引

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)

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2019-07-25
      • 2011-03-08
      相关资源
      最近更新 更多