【问题标题】:Return all matches for a capturing group in Python [duplicate]返回Python中捕获组的所有匹配项[重复]
【发布时间】:2019-08-23 02:04:51
【问题描述】:

我正在实现一个方法,它采用像r'(\w+/)+end' 这样的正则表达式模式和一个字符串'ab/cd/ef/end'。请注意,我不能请求方法的调用者更新他们的模式格式。在该方法中,我需要执行一个操作,该操作需要提取第一个捕获组的所有匹配项,即ab/cd/ef/

如何在 Python 中实现这一点?类似下面的内容为每个捕获组返回一个最后匹配的元组。在这个例子中我们只有一个,所以它返回('ef/',)

re.match(r'(\w+/)+end', 'ab/cd/ef/end').groups()

顺便说一句,在 C# 中,每个捕获组都可以匹配多个字符串,例如Regex.Match("ab/cd/ef/end", @"(\w+/)+end").Groups[1].Captures 将返回第一个捕获组 (\w+/)+ 的所有三个匹配项。

【问题讨论】:

  • 无法接受答案。我已经提到不可能更改正则表达式。在捕获组括号中提取模式文本可能容易出错。我将继续使用正则表达式项目 (pypi.org/project/regex)。它很好地解决了我的问题:regex.match(r'(\w+/)+end', 'ab/cd/ef/end').captures(1) 返回['ab/', 'cd/', 'ef/']

标签: python regex regex-group


【解决方案1】:

如果您只想捕获所有后跟分隔符的路径名,请使用模式\w+/re.findall

inp = "ab/cd/ef/end"
matches = re.findall(r'\w+/', inp)
print(matches)

['ab/', 'cd/', 'ef/']

如果您想要所有路径组件,无论它们前面是否有路径分隔符,那么我们可以尝试:

inp = "ab/cd/ef/end"
matches = re.findall(r'[^/]+', inp)

【讨论】:

    【解决方案2】:
    r = r"(\w+/)(?<!end)"
    s = "ab/cd/ef/end"
    
    m = re.finditer(r, s, re.MULTILINE)
    
    for g in m:
        print(g.group())
    

    示例

    https://regex101.com/r/VJ6knI/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多