如何在Python中找到正则表达式第n个匹配项的起始位置?

如何在Python中找到正则表达式第n个匹配项的起始位置?,python,regex,Python,Regex,我目前正在学习Python中正则表达式的工作原理,到目前为止,我发现一切都很容易理解 我知道您可以使用.start函数在Python中找到匹配对象的起始位置 我知道可以使用re.findAll()函数检索总匹配项列表(字符串形式) 有人知道是否有一种简单的方法可以找到第n个元素的起始位置吗 到目前为止,我只能想到一种方法,这是一种手工编码的解决方案,在这种解决方案中,我迭代地将字符串按每个匹配项拆分为n个字符,同时计算总字符数: def getNthStartingPosOfPattern(pa

我目前正在学习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库是否为我们提供了一种更简单的方法来实现这一点,而我还没有理解

非常感谢您抽出宝贵的时间

您可以在以下帮助下使用:

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

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))
请参见

您可以使用您可以在以下帮助下访问的:

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

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))

请参见

巨大的响应。我将[4]移动到[n],并将其转换为函数。re.finditer()是否会在幕后生成?它会在字符串中生成re模式的所有非重叠匹配上的MatchObject实例。变成了
def
。根据@jeffmandel edit,我认为更新后的函数返回结果的速度会比使用comprehension更快,因为它之前不必收集所有匹配项。反应很好。我将[4]移动到[n],并将其转换为函数。re.finditer()是否会在幕后生成?它会在字符串中生成re模式的所有非重叠匹配上的MatchObject实例。转换为
def
。根据@jeffmandel edit,我认为更新后的函数返回结果的速度会比使用comprehension更快,因为它之前不必收集所有匹配项。