被正则表达式的 re.findall 函数卡住了[重复]

Posted

技术标签:

【中文标题】被正则表达式的 re.findall 函数卡住了[重复]【英文标题】:Got stuck with re.findall function for regular expressions [duplicate] 【发布时间】:2020-09-14 21:36:38 【问题描述】:

我有一个字符串,看起来像

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) 的正则表达式。请帮忙

【问题讨论】:

【参考方案1】:

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

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

Demo

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

不适用于ru,将其更改为r 就可以了。 原来在 Python 3 中字符串总是 Unicode,所以不需要u

以上是关于被正则表达式的 re.findall 函数卡住了[重复]的主要内容,如果未能解决你的问题,请参考以下文章

是否有 Python 的 re.findall/re.finditer(迭代正则表达式结果)的 Perl 等价物?

Python之正则re模块 --- findall()详解

Python中的re.findall('(\d)\\1+','33acad122')怎么理解,求详

python正则表达式re.findall(r"\b\w+\b", s)中的r是啥意思?

7.python之正则表达式re模块

python:非正则表达式等价于 re.findall