findall没有在python3.7中返回所有结果

2024-06-16 11:09:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用字符串string1string3后面的数据创建元组列表。但没有达到预期效果。在

s = 'string1:1234string2string3:a1b2c3string1:2345string3:b5c6d7'
re.findall('string1:(\d+)[\s,\S]+string3:([\s\S]+',s)

实际结果:

^{pr2}$

预期结果:

[('1234', 'a1b2c3'), ('2345', 'b5c6d7')]

Tags: 数据字符串re列表元组效果string1findall
2条回答

问题是[\s,\S]+是贪婪的,因此会消耗第一个string1和最后一个string3之间的所有内容。在

您可以通过使用正lookaheads并使regex非贪心,如下所示:

string1:(\d+)[^\d][\s,\S]+?string3:([\s\S]+?(?=string|$))

您当前的regex使用[\s,\S]+,这是贪婪的,匹配所有字符,直到行尾。在

您可以将其设为非贪心的,并对最后一个断言以下内容的匹配使用一个正的lookahead (?=string|$),该匹配要么是{},要么是行尾{}。在

^{}

import re 
s = 'string1:1234string2string3:a1b2c3string1:2345string3:b5c6d7'
print(re.findall('string1:(\d+).*?string3:(.*?)(?=string|$)',s))

Demo

相关问题 更多 >