用例
我想使用正则表达式来捕获位置未知的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":
问题
如何执行此操作?如何快速做到这一点?
答案 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
,其中包括内部{
。
由于第二组的工作量是从左到右,因此非贪婪量词在第一个}
之前停止,因此它可以像第二组一样工作。