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

时间:2017-12-28 15:35:10

标签: python regex

我有以下字符串:

s = " 3434 garbage workorders: 138 waiting, 2 running, 3 failed, 134 completed"

我想解析状态,并在工作人员"之后计算。我试过以下正则表达式:

r = r"workorders:( (\d+) (\w+),?)*"

但这只返回最后一组。我怎样才能归还所有团体?

P.S。我知道我可以在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')]

5 个答案:

答案 0 :(得分:2)

对于示例中的文本,您可以这样尝试:

(?:(\d+) (\w+)(?=,|$))+

<强>解释

  • 非捕获组(?:
  • 一个或多个数字(\d+)
  • 的捕获组
  • 空格
  • 一个或多个单词字符(\w+)
  • 的捕获组
  • 一个正面的表面,断言后面的内容是逗号或字符串的结尾(?=,|$)
  • 关闭非捕获组并重复一次或多次)+

Demo

那会给你:

[('138', 'waiting'), ('2', 'running'), ('3', 'failed'), ('134', 'completed')]

答案 1 :(得分:1)

这适用于您的特定情况:

class NiceOutputOfA : public A {...};

答案 2 :(得分:1)

根据我的经验,我发现在尽可能多地处理字符串之后使用正则表达式会更好;任意字符串上的正则表达式只会引起麻烦。

在你的情况下,尝试拆分':'(甚至是工作人员:)并获取之后的东西,只获得状态计数。在那之后,很容易获得每个状态的计数。

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')]

编辑:更改表达式以满足期望的结果和更强大的

答案 3 :(得分:0)

只会查看:

之后的正则表达式的答案
 re.findall(r'(?: )\d+ \w+')

答案 4 :(得分:0)

这将准确地为您提供输出。

map = re.findall(r'(\d+) ([A-Za-z]+)', s.split("workorders:")[1])

然后你可以破坏这个初始化。

x = {v: int(k) for k, v in map}