我目前正在学习正则表达式在Python中的工作方式,到目前为止,发现所有内容都很容易理解。

我知道您可以使用.start函数在Python中找到匹配对象的起始位置。

我知道您可以使用re.findAll()函数检索所有匹配项的列表(以字符串形式)。

有谁知道是否有一种简单的方法来找到第n个元素的起始位置?

到目前为止,我只能想到一种方法,这是一个手工编码的解决方案,在该方法中,我将每个匹配项迭代地拆分为n个字符串,并在进行操作时计算总字符数:

def getNthStartingPosOfPattern(pattern, text, n):
    all_matches = re.findall(pattern, text)
    result = 0
    for i in range(n):
        this_split = text.split(all_matches[i])
        result += len(this_split[0])
        new_start_pos = result + len(all_matches[i])
        text = text[new_start_pos:]
    return result


text = "09834 82 Monkey-wtf 2323, 8371853 Monkey-wtf 244, 39082348 Monkey-ftw 827,2  Monkey-lbj 2,24857 Monkey-kkk,oo293 Monkey-iij 55, 273 Monkey-eif 7,22288888 Monkey-abc"
pattern = r'Monkey-[a-z]{3}'
result = getNthStartingPosOfPattern(pattern, text, 5)
print(result)


这似乎可行,但似乎很麻烦,并且容易出现极端情况。 Python库是否为我们提供了一种我还不了解的简单方法?

非常感谢您的宝贵时间

最佳答案

您可以使用MatchObject.start(),可以在re.finditer的帮助下进行访问:

在这里,您可以像这样获得第五场比赛的开始位置:

import re
def getNthStartingPosOfPattern(pattern, text, n):
    for i,x in enumerate(re.finditer(pattern, text)):
        if i == n-1:
            return x.start()

text = "09834 82 Monkey-wtf 2323, 8371853 Monkey-wtf 244, 39082348 Monkey-ftw 827,2  Monkey-lbj 2,24857 Monkey-kkk,oo293 Monkey-iij 55, 273 Monkey-eif 7,22288888 Monkey-abc"
pattern = r'Monkey-[a-z]{3}'
print(getNthStartingPosOfPattern(pattern, text, 5))


IDEONE demo

07-24 18:18
查看更多