繁体   English   中英

正则表达式匹配多个重复组

[英]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+)(?=,|$))+

说明

  • 非捕获组(?:
  • 一个或多个数字的捕获组(\\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM