[英]regex matching multiple repeating groups
我有以下字符串:
s = " 3434 garbage workorders: 138 waiting, 2 running, 3 failed, 134 completed"
我想解析“工作订单”之后的状态和计数。 我已经尝试过以下正则表达式:
r = r"workorders:( (\d+) (\w+),?)*"
但这只会返回最后一组。 如何退回所有团体?
ps我知道我可以在python中做到这一点,但想知道是否有一个纯正则表达式解决方案
>>> s = " 3434 garbage workorders: 138 waiting, 2 running, 3 failed, 134 completed"
>>> r = r"workorders:( (\d+) (\w+),?)*"
>>> re.findall(r, s)
[(' 134 completed', '134', 'completed')]
>>>
输出应接近
[('138', 'waiting'), ('2', 'running'), ('3', 'failed'), ('134', 'completed')]
对于示例中的文本,您可以这样尝试:
说明
(?:
(\\d+)
(\\w+)
捕获组 (?=,|$)
)+
那会给你:
[('138', 'waiting'), ('2', 'running'), ('3', 'failed'), ('134', 'completed')]
这应该适合您的特定情况:
re.findall('[:,] (\d+)', s)
根据我的经验,我发现在尽可能多地处理字符串之后,最好使用正则表达式。 正则表达式在任意字符串上只会引起头痛。
在您的情况下,请尝试分割':'(甚至是工作订单:),然后再获取内容以仅获取状态计数。 之后,很容易获得每种状态的计数。
s = " 3434 garbage workorders: 138 waiting, 2 running, 3 failed, 134
completed"
statuses = s.split(':') #['3434 garbage workorders', ' 138 waiting, 2 running, 3 failed, 134 completed']
statusesStr = ''.join(statuses[1]) # ' 138 waiting, 2 running, 3 failed, 134 completed'
statusRe = re.compile("(\d+)\s*(\w+)")
statusRe.findall(statusesStr) #[('138', 'waiting'), ('2', 'running'), ('3', 'failed'), ('134', 'completed')]
编辑:更改表达式以满足期望的结果并且更强大
只会看后面的正则表达式的答案:
re.findall(r'(?: )\d+ \w+')
这将为您提供准确的输出。
map = re.findall(r'(\d+) ([A-Za-z]+)', s.split("workorders:")[1])
然后,您可以破坏此init。
x = {v: int(k) for k, v in map}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.