基本上,我想找到任何子串的第一次出现的索引:“ABC”,“DEF”或“GHI”,只要它们以3的间隔出现。我为匹配这种模式而编写的正则表达式是:
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中写太多,所以请原谅我,如果这是一个微不足道的问题。
答案 0 :(得分:4)
你走在正确的轨道上。 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).group(1).start()
而不是match(regex, text).start(1)
。
答案 1 :(得分: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)`