被正则表达式的 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('(\d)\\1+','33acad122')怎么理解,求详