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