提取前缀和多个后续匹配项

extract a prefix and multiple subsequent matches

我的问题

我有一行包含一个前缀,后跟一个或多个匹配的模式。例如,前缀是一个字母后跟一个或多个由空格分隔的数字:

s='A 3 4 5'

我想找到一个可以同时提取前缀和重复模式的正则表达式模式。

我尝试了什么

s='''A 3 4 5'''
reg = re.compile(r'''
    ^(\w)       # Prefix
    (
        \s*     # Space separator
        (\d+)   # Pattern
        \s*     # Space separator
    )*
''', re.VERBOSE)
print(reg.findall(s))

但是,它只找到前缀和一个匹配项:

[('A', '5', '5')]

匹配的模式出现两次,因为我有两组 - 一组包含模式本身,另一组包含模式及其分隔符。

我的问题

如何使用 Python 正则表达式检索由给定分隔符分隔的单个前缀和多个匹配模式?

这是一个棘手的问题,因为一旦正则表达式引擎匹配并使用前缀 A,它就不会再次检查它。这是一种避免直接使用正则表达式的解决方法:

s = 'A 3 4 5'
prefix = re.findall(r'[A-Z]+', s)[0]
terms = re.sub(r'\b(\d+)\b', prefix + r'', s).split(' ')[1:]
print(terms)

这会打印:

['A3', 'A4', 'A5']

如果您还没有上述格式的 s 输入,那么在考虑上述答案之前,您可能需要做一些调整才能到达这个起点。

这将需要两级正则表达式。这是一个示例方法:

>>> import re
>>> s='''A 3 4 5'''
>>> outer_match = re.match(r'^(?P<prefix>\w)(?P<suffix>(\s*\d+\s*)*)', s)
>>> outer_match.groupdict()
{'prefix': 'A', 'suffix': ' 3 4 5'}

然后提取后缀片:

>>> prefix = outer_match.group('prefix')
>>> suffixes = re.findall(r'\s*(?P<val>\d+)\s*', outer_match.group('suffix'))
>>> suffixes
['3', '4', '5']

使用 PyPi 正则表达式库:

import regex
s='''A 3 4 5'''
reg = regex.compile(r'''
    ^(\w)       # Prefix
    (
        \s*     # Space separator
        (\d+)   # Pattern
        \s*     # Space separator
    )*
''', regex.VERBOSE)
m = regex.fullmatch(reg, s)
if m:
    res = []
    res.append(m.group(1))
    res.extend(m.captures(2))
    print(res)

参见Python proof

结果['A', ' 3 ', '4 ', '5']