findall没有重新调整Python 3.7中的所有结果



我正试图用字符串string1string3之后的数据创建元组列表。但没有得到预期的结果。

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

实际结果:

[('1234', 'b5c6d7)']

预期结果:

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

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

您可以将其设为非贪婪,并对最后一个匹配使用正向前瞻(?=string|$),以断言接下来的是string或行$的末尾。

string1:(d+).*?string3:(.*?)(?=string|$)

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

演示

问题是[s,S]+是贪婪的,因此消耗了第一个字符串1和最后一个字符串3之间的所有内容。

您可以通过使用正向lookahead并使正则表达式不贪婪来解决此问题,如下所示:

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

最新更新