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



我的问题

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

s='A 3 4 5'

我想找到一个regex模式,它可以提取前缀和重复模式。

我试过什么

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正则表达式检索由给定分隔符分隔的单个前缀和多个匹配模式

这将需要一个两级正则表达式。下面是一个例子:

>>> 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']

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

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

此打印:

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

如果你还没有上面给出的格式的s输入,那么在考虑上面的答案之前,你可能需要做一些按摩来达到这个起点。

使用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验证。

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

相关内容

最新更新