找出Python正则表达式中的捕获组数量

its*_*dok 36 python regex

有没有办法确定给定正则表达式中有多少个捕获组?

我希望能够做到以下几点:

def groups(regexp, s):
    """ Returns the first result of re.findall, or an empty default

    >>> groups(r'(\d)(\d)(\d)', '123')
    ('1', '2', '3')
    >>> groups(r'(\d)(\d)(\d)', 'abc')
    ('', '', '')
    """
    import re
    m = re.search(regexp, s)
    if m:
        return m.groups()
    return ('',) * num_of_groups(regexp)
Run Code Online (Sandbox Code Playgroud)

这允许我做的事情:

first, last, phone = groups(r'(\w+) (\w+) ([\d\-]+)', 'John Doe 555-3456')
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何实施num_of_groups.(目前我只是解决它.)

编辑:按照rslite建议,我换成re.findallre.search.

sre_parse 看起来像是最强大和最全面的解决方案,但需要树遍历并且看起来有点沉重.

MizardX的正则表达似乎覆盖了所有基础,所以我将继续使用它.

Mar*_*rot 38

def num_groups(regex):
    return re.compile(regex).groups
Run Code Online (Sandbox Code Playgroud)

  • 这实际上不会返回组的数量,它将返回所有组的元组.为了返回组的​​数量,你需要以下代码(在Python 3.4中):`return len(re.compile(regex).groups())` (7认同)
  • @RaziShaban`re.compile(regex).groups`是`int`类型的属性.`re.compile(regex).match(输入).groups()`是一个方法,返回一个`tuple`. (4认同)
  • 我喜欢在完成 match = re.search() 或任何返回匹配对象后只使用 len(match.groups()) 。 (3认同)

小智 17

f_x = re.search(...)
len_groups = len(f_x.groups())
Run Code Online (Sandbox Code Playgroud)

  • @nupanick所以需要检查`if f_x: len(f_x.groups())` (2认同)