我有以下字符串:
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')]
答案 0 :(得分:2)
对于示例中的文本,您可以这样尝试:
<强>解释强>
(?:
(\d+)
(\w+)
(?=,|$)
)+
那会给你:
[('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}