我试图用字符串string1
和string3
之后的数据创建元组列表。但是没有得到预期的结果。
s = 'string1:1234string2string3:a1b2c3string1:2345string3:b5c6d7'
re.findall('string1:(\d+)[\s,\S]+string3:([\s\S]+',s)
实际结果:
[('1234', 'b5c6d7)']
预期结果:
[('1234', 'a1b2c3'), ('2345', 'b5c6d7')]
答案 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))
答案 1 :(得分:0)
问题在于[\s,\S]+
贪婪,因此消耗了第一个字符串1和最后一个字符串3之间的所有内容。
您可以通过使用正向先行并使正则表达式变得非贪婪来解决此问题:
string1:(\d+)[^\d][\s,\S]+?string3:([\s\S]+?(?=string|$))