在python中使用re-findall返回任意数量的匹配组
我有一个相对复杂的字符串,其中包含一组数据。我试图使用regex命令提取字符串的相关部分。我感兴趣的部分包含在方括号中,如下所示:在python中使用re-findall返回任意数量的匹配组,python,regex,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 = '"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}]']
我怎么才能抓住他们 这是因为默认情况下量词是贪婪的。因此,
*
将匹配第一个“数据”:
和最后一个[
,因此只剩下一个[…]
要匹配
通过添加?
使用非贪婪量词
l = re.findall(r'\"data\"\:.*?(\[.*?\])', s)
这是因为默认情况下量词是贪婪的。所以
*
将匹配第一个“数据”:
和最后一个[
,因此只剩下一个[…]
要匹配
通过添加?
使用非贪婪量词
l = re.findall(r'\"data\"\:.*?(\[.*?\])', s)
您还可以使用以迭代方式提取相关内容:
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}]
您还可以使用以迭代方式提取相关内容:
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}]
为什么你要用正则表达式来解析JSON?@Barmar主要是因为我必须处理的数据是嵌入在JSON中的。有没有更好的方法??是的,使用JSON解析器…;)事实上,
lol haha
东西使JSON无效。*
是贪婪的。它会抓取尽可能多的元素。你可以通过addin使它变懒g一个问号*?
。另外,你不需要跳出冒号。为什么你要尝试使用正则表达式来解析JSON?@Barmar主要是因为我必须处理的数据是嵌入在JSON中的。有没有更好的方法?是的,使用JSON解析器…;)事实上,哈哈哈
的东西使得JSON无效。*
是greedy。它会抓取尽可能多的元素。你可以通过添加一个问号*?
使它变得懒惰。而且,你不需要逃逸冒号。是的,这完全正确。多谢了,这是一个非常基本的解决方案,我很惊讶我错过了!贪婪与非贪婪匹配是更难融入其中的概念之一regex thnking,所以你忽略它并不奇怪。是的,这是完全正确的。感谢大家,这是一个非常基本的解决方案,我很惊讶我错过了!贪婪与非贪婪匹配是更难融入regex thnking的概念之一,所以你忽略它也就不足为奇了。