首页 > 解决方案 > 使用正则表达式抓取每次出现的内容

问题描述

用例

我想使用正则表达式来获取位置未知的一小部分 json 数据。虽然 Python 有一个 json 库,但是解析所有的 json 数据是很慢的。json 数据具有常规格式。

目标

对于 的每次出现1001,我想抓取包含该出现的最里面的大括号中的内容

代码

import re
x = r'{123:{"a":100, "asdf":"example.com","at":1001},'\
    '47289:{"a":20, "asdf":"test.org","at":20},}'
regex = r'{(.*?)1001(.*?)}'
print(re.match(regex, x).group(1))

期望的结果

{"a":100, "asdf":"example.com","at":1001}

实际结果

123:{"a":100, "asdf":"example.com","at":

问题

这个怎么做?如何快速做到这一点?

标签: pythonjsonregex

解决方案


不要使用.*?,它会匹配任何字符,包括{. 改为使用[^{]*?

您还需要使用re.search(), not re.match(),因为match()仅匹配字符串的开头。请参阅re.search 和 re.match 有什么区别?.

要获得整个比赛,请使用.group(0). .group(1)只返回匹配的部分[^}]*?

import re
x = r'{123:{"a":100, "asdf":"example.com","at":1001},'\
    '47289:{"a":20, "asdf":"test.org","at":20},}'
regex = r'{([^{]*?)1001(.*?)}'
print(re.search(regex, x).group(0))

让它不贪心并不能解决问题,因为匹配是从左到右的。所以{将匹配第一个{,然后.*将匹配所有内容,直到1001,其中包括内部{

它对第二组按预期工作,因为非贪婪量词在第一组之前停止},因为它是从左到右工作的。


推荐阅读