我的问题
我有一行包含一个前缀,后跟一个或多个匹配的模式。例如,前缀是一个字母,后面跟着一个或多个用空格分隔的数字:
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']
。