findall不检索Python 3.7中的所有结果

时间:2018-07-16 07:22:53

标签: python regex python-3.x

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

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

实际结果:

[('1234', 'b5c6d7)']

预期结果:

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

2 个答案:

答案 0 :(得分:3)

您当前的正则表达式使用贪婪的[\s,\S]+并匹配所有字符,直到行尾为止。

您可以将其设为非贪婪,并在肯定符合以下条件的最后一场比赛中使用正向前瞻(?=string|$)string或行$的结尾。

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

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

Demo

答案 1 :(得分:0)

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

您可以通过使用正向先行并使正则表达式变得非贪婪来解决此问题:

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