使用正则表达式

时间:2018-12-21 05:07:03

标签: python json regex

用例

我想使用正则表达式来捕获位置未知的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":

问题

如何执行此操作?如何快速做到这一点?

1 个答案:

答案 0 :(得分:1)

请勿使用.*?,它将匹配任何字符,包括{。请改用[^{]*?

您还需要使用re.search()而不是re.match(),因为match()仅在字符串的开头匹配。参见What is the difference between re.search and 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,其中包括内部{

由于第二组的工作量是从左到右,因此非贪婪量词在第一个}之前停止,因此它可以像第二组一样工作。