Python re.findall() 获取所有匹配的组
Python re.findall() to get all matched groups
这是带分隔符的文本,但我想使用正则表达式对其进行解析。
第二列和下一列需要几秒或几毫秒。
>>> import re
>>> s = '''aaa
bbb|30s
ccc|500ms|1s'''
>>> re.findall(r'(\w+)(?:\|(\d+(?:s|ms)))?(?:\|(\d+(?:s|ms)))?', s)
输出(预期答案):
[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]
我想通过使用像 * 或 {x,y} 这样的量词来缩短这个模式。
所以我做了:
>>> re.findall(r'(\w+)(?:(?:\|(\d+(?:s|ms)))*)', cmdstr)
[('aaa', ''), ('bbb', '30s'), ('ccc', '500ms')] # WRONG
我失败了。
我该如何做这个正则表达式模式?
import re
s = '''aaa
bbb|30s
ccc|500ms|1s'''
print(re.findall(r'(\w+)\|?(\w+)?\|?(\w+)?', s))
输出:
[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]
您似乎在询问是否可以使用可变数量的正则表达式组。根据快速 Google 搜索,答案似乎是否定的,正则表达式将匹配完整模式,但对于同一组的重复匹配,只会记录最后一个值。
考虑简单地执行 s.split('|')
,然后对每个子字符串执行任何必要的检查。
这是带分隔符的文本,但我想使用正则表达式对其进行解析。
第二列和下一列需要几秒或几毫秒。
>>> import re
>>> s = '''aaa
bbb|30s
ccc|500ms|1s'''
>>> re.findall(r'(\w+)(?:\|(\d+(?:s|ms)))?(?:\|(\d+(?:s|ms)))?', s)
输出(预期答案):
[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]
我想通过使用像 * 或 {x,y} 这样的量词来缩短这个模式。
所以我做了:
>>> re.findall(r'(\w+)(?:(?:\|(\d+(?:s|ms)))*)', cmdstr)
[('aaa', ''), ('bbb', '30s'), ('ccc', '500ms')] # WRONG
我失败了。
我该如何做这个正则表达式模式?
import re
s = '''aaa
bbb|30s
ccc|500ms|1s'''
print(re.findall(r'(\w+)\|?(\w+)?\|?(\w+)?', s))
输出:
[('aaa', '', ''), ('bbb', '30s', ''), ('ccc', '500ms', '1s')]
您似乎在询问是否可以使用可变数量的正则表达式组。根据快速 Google 搜索,答案似乎是否定的,正则表达式将匹配完整模式,但对于同一组的重复匹配,只会记录最后一个值。
考虑简单地执行 s.split('|')
,然后对每个子字符串执行任何必要的检查。