基本上,我想找到任何子字符串第一次出现的索引:“ABC”、“DEF”或“GHI”,只要它们出现在三个间隔中。我为匹配此模式而编写的正则表达式是:
regex = compile ("(?:[a-zA-Z]{3})*?(ABC|DEF|GHI)")
Run Code Online (Sandbox Code Playgroud)
在*?确保我得到的第一场比赛,因为它的非贪婪。我正在使用捕获组,因为我认为这是实际获取我实际正在寻找的(子字符串的)索引的唯一方法。我不在乎比赛本身从哪里开始,只关心捕获组从哪里开始。在...{3}...该模式发生在3,即时间间隔的任务:
example_1 = "BNDABCDJML"
example_2 = "JKMJABCKME"
Run Code Online (Sandbox Code Playgroud)
example_1将匹配,因为"ABC"在位置3处发生,但example_2将不匹配,因为"ABC"在第4位发生。
理想情况下,给定字符串:
text = "STCABCFFC"
Run Code Online (Sandbox Code Playgroud)
这个匹配,但如果我只是得到比赛的开始,它会给我0,因为这是比赛的开始索引,我想要的是3
我想这样做:
print match(regex, text).group(1).start()
Run Code Online (Sandbox Code Playgroud)
但是,当然,这不起作用,因为start()它不是字符串的方法,而且字符串现在独立于text. 我不能简单地搜索捕获组中子字符串的起始索引,因为这不能保证它遵循正则表达式模式(仅以 3 为间隔出现)。也许我忽略了一些东西,我没有用python写太多,所以如果这是一个微不足道的问题,请原谅我。
您可以从对象中获取开始和结束索引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)`
Run Code Online (Sandbox Code Playgroud)
你走在正确的轨道上。start是 MatchObject 的一种方法。这是他们在文档中给出的示例:
>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email[:m.start()] + email[m.end():]
'tony@tiger.net'
Run Code Online (Sandbox Code Playgroud)
基本上,而不是match(regex, text).group(1).start()你应该做match(regex, text).start(1)。
| 归档时间: |
|
| 查看次数: |
2820 次 |
| 最近记录: |