被正则表达式的 re.findall 函数困住了

Got stuck with re.findall function for regular expressions

我有一个看起来像

的字符串
text = "customer: Anna Smith; payment: 123; date: 12-02-2020; customer: Jack; payment: 10.3; date: 20-03-2020"

现在我想把它变成一个元组列表(稍后我可以用它来创建字典):

[('customer', 'Anna Smith'),
 ('payment', '123'),
 ('date', '12-02-2020'),
 ('customer', 'Jack'),
 ('payment', '10.3'),
 ('date', '20-03-2020')]

我尝试通过以下方式将 re.findall 用于此目的:

re.findall(u'(\w+): (.+?);', text)

当然它不会捕获最后一对键和值,因为正则表达式中有分号。我想我在这里需要一个 if-else if 操作:如果解析器遇到分号,那么它会提取单词,否则它会检查 EOL (\Z) 的正则表达式。求助

如果你也想匹配最后一个,使用这个模式(\w+): (.+?)(?:;|$)

此模式与您的模式之间的唯一区别是它将接受查找以 ;$ 结尾的匹配项,后者是行尾字符。

Demo

不匹配 ;,而是将 .+? 更改为 [^;]+,这样它就可以匹配 ; 以外的所有内容。

re.findall(r'(\w+): ([^;]+)', text)

为简单起见,我们还可以使用 split 函数。

arr = text.split("; ")
result = []
for a in arr:
    _ = a.split(": ")
    result.append((_[0], _[1]))

现在 result 列表包含您想要的输出