在python中使用re findall返回任意数量的匹配组

时间:2016-09-08 22:11:07

标签: python regex

我有一个相对复杂的字符串,其中包含一堆数据。我试图使用regex命令提取字符串的相关部分。我感兴趣的部分包含在方括号中,如下所示:

s = '"data":["value":3.44}] lol haha "data":["value":55.34}] 
                "data":["value":2.44}] lol haha "data":["value":56.34}]'

我构建的正则表达式如下:

l = re.findall(r'\"data\"\:.*(\[.*\])', s)

我原本希望这会回来

['["value":3.44}]', '["value":55.34}]', '["value":2.44}]', '["value":56.34}]']

但我得到的只是最后一个,即

['["value":56.34}]']

我怎样才能抓住所有人?

2 个答案:

答案 0 :(得分:2)

这是因为默认情况下量词是贪婪的。因此.*将匹配第一个"data":和最后一个[之间的所有内容,因此只剩下一个[...]匹配。

通过添加?来使用非贪婪量词。

l = re.findall(r'\"data\"\:.*?(\[.*?\])', s)

答案 1 :(得分:1)

您还可以使用finditer迭代地提取相关内容:

import re

s = '"data":["value":3.44}] lol haha "data":["value":55.34}] "data":["value":2.44}] lol haha "data":["value":56.34}]'
for m in re.finditer(r'(\[.*?\])', s):
    print m.group(1)

<强>输出

["value":3.44}]
["value":55.34}]
["value":2.44}]
["value":56.34}]