2024-06-16 11:09:43 发布
网友
我试图用字符串string1和string3后面的数据创建元组列表。但没有达到预期效果。在
string1
string3
s = 'string1:1234string2string3:a1b2c3string1:2345string3:b5c6d7' re.findall('string1:(\d+)[\s,\S]+string3:([\s\S]+',s)
实际结果:
预期结果:
[('1234', 'a1b2c3'), ('2345', 'b5c6d7')]
问题是[\s,\S]+是贪婪的,因此会消耗第一个string1和最后一个string3之间的所有内容。在
[\s,\S]+
您可以通过使用正lookaheads并使regex非贪心,如下所示:
string1:(\d+)[^\d][\s,\S]+?string3:([\s\S]+?(?=string|$))
您当前的regex使用[\s,\S]+,这是贪婪的,匹配所有字符,直到行尾。在
您可以将其设为非贪心的,并对最后一个断言以下内容的匹配使用一个正的lookahead (?=string|$),该匹配要么是{},要么是行尾{}。在
(?=string|$)
^{}
import re s = 'string1:1234string2string3:a1b2c3string1:2345string3:b5c6d7' print(re.findall('string1:(\d+).*?string3:(.*?)(?=string|$)',s))
Demo
问题是
[\s,\S]+
是贪婪的,因此会消耗第一个string1和最后一个string3之间的所有内容。在您可以通过使用正lookaheads并使regex非贪心,如下所示:
您当前的regex使用
[\s,\S]+
,这是贪婪的,匹配所有字符,直到行尾。在您可以将其设为非贪心的,并对最后一个断言以下内容的匹配使用一个正的lookahead},要么是行尾{}。在
(?=string|$)
,该匹配要么是{^{}
Demo
相关问题 更多 >
编程相关推荐