我正试图用字符串string1
和string3
之后的数据创建元组列表。但没有得到预期的结果。
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|$))