【问题标题】:Get start location of capturing group within regex pattern在正则表达式模式中获取捕获组的开始位置
【发布时间】:2013-09-15 15:54:07
【问题描述】:

基本上,我想找到任何子字符串第一次出现的索引:“ABC”、“DEF”或“GHI”,只要它们以三个间隔出现。我为匹配此模式而编写的正则表达式是:

regex = compile ("(?:[a-zA-Z]{3})*?(ABC|DEF|GHI)") 

*? 确保我得到第一场比赛,因为它是非贪婪的。我正在使用捕获组,因为我认为这是实际获取我实际正在寻找的(子字符串的)索引的唯一方法。我不在乎比赛本身从哪里开始,只在乎捕获组从哪里开始。 ...{3}... 要求模式以 3 的间隔出现,即:

example_1 = "BNDABCDJML"

example_2 = "JKMJABCKME"

example_1 将匹配,因为 "ABC" 出现在位置 3,但 example_2匹配,因为 "ABC" 出现在位置 4。

理想情况下,给定字符串:

text = "STCABCFFC"

这匹配,但如果我只是获得比赛的开始,它会给我0,因为那是比赛的开始索引,我想要的是3

我想这样做:

print match(regex, text).group(1).start()

但是,当然,这不起作用,因为start() 不是字符串的方法,而且字符串现在独立于text。我不能简单地在捕获组中搜索子字符串的起始索引,因为这不能保证我遵循正则表达式模式(仅以 3 为间隔出现)。可能是我忽略了一些东西,我没有用python写太多,如果这是一个琐碎的问题,请见谅。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    你在正确的轨道上。 start is a method for the MatchObject。这是他们在文档中给出的示例:

    >>> email = "tony@tiremove_thisger.net"
    >>> m = re.search("remove_this", email)
    >>> email[:m.start()] + email[m.end():]
    'tony@tiger.net'
    

    基本上,您应该使用match(regex, text).start(1) 而不是match(regex, text).group(1).start()

    【讨论】:

      【解决方案2】:

      可以从match对象——re.MatchObject.start(group)re.MatchObject.end(group)获取开始和结束索引:

      regex = compile ("(?:[a-zA-Z]{3})*?(ABC|DEF|GHI)") 
      
      for m in re.finditer(regex, "STCABCFFC"):
          print m.start(1), m.end(1)
          print m.span(1)  # Prints 2-element tuple `(start, end)`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-24
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 1970-01-01
        • 2011-06-03
        相关资源
        最近更新 更多