在python中解析JSON对象而不使用JSON库(仅使用正则表达式)

在python中解析JSON对象而不使用JSON库(仅使用正则表达式),python,regex,json,python-2.7,instagram,Python,Regex,Json,Python 2.7,Instagram,目前,我正在使用构建一个小型应用程序,该应用程序使用JSON“objects”来响应GET操作。为了获得响应,我目前正在使用urllib2 这是我目前参加的一门课程的一部分作业,最大的挑战是我们不允许使用JSON库快速解析和检索instagram响应中的信息。我们被迫使用正则表达式库(仅此而已)来正确解析信息 例如,获取用户提要页面的instagram响应格式遵循中所示的结构 老实说,我自己花了3个小时试图弄明白这一点,也试图在互联网上获取信息,但大多数回答的问题总是指出使用JSON库 任何提示

目前,我正在使用构建一个小型应用程序,该应用程序使用JSON“objects”来响应GET操作。为了获得响应,我目前正在使用urllib2

这是我目前参加的一门课程的一部分作业,最大的挑战是我们不允许使用JSON库快速解析和检索instagram响应中的信息。我们被迫使用正则表达式库(仅此而已)来正确解析信息

例如,获取用户提要页面的instagram响应格式遵循中所示的结构

老实说,我自己花了3个小时试图弄明白这一点,也试图在互联网上获取信息,但大多数回答的问题总是指出使用JSON库

任何提示或建议都会派上用场

此外,除了urllib2(可能被认为是外部的),我不允许使用任何其他外部库(更像是第三方库),而不是python 2.7提供的库


提前感谢。

使用函数解析器库和一些正则表达式怎么样

def parse(seq):
    'Sequence(Token) -> object'
    ...
    n = lambda s: a(Token('Name', s)) >> tokval
    def make_array(n):
        if n is None:
            return []
        else:
            return [n[0]] + n[1]
    ...
    null = n('null') >> const(None)
    true = n('true') >> const(True)
    false = n('false') >> const(False)
    number = toktype('Number') >> make_number
    string = toktype('String') >> make_string
    value = forward_decl()
    member = string + op_(':') + value >> tuple
    object = (
        op_('{') +
        maybe(member + many(op_(',') + member)) +
        op_('}')
        >> make_object)
    array = (
        op_('[') +
        maybe(value + many(op_(',') + value)) +
        op_(']')
        >> make_array)
    value.define(
          null
        | true
        | false
        | object
        | array
        | number
        | string)
    json_text = object | array
    json_file = json_text + skip(finished)

    return json_file.parse(seq)
你需要这个图书馆


注意:仅使用纯正则表达式执行此操作太难了。您需要编写某种类型的“解析器”——因此您也可以使用解析器库来帮助处理一些枯燥的内容。

这其实并不复杂,当您执行get请求时,您将得到一堆代码,您只需要从这些代码中提取一小部分,例如,如果您想解析来自用户的新闻提要,并获取图像及其标题:

query = "https://api.instagram.com/v1/users/"+profile_id+"/media/recent?access_token="+token
response = urlopen(query)
the_page = response.read()
feed = {}
feed['images'] = []
feed['captions'] = []
matchImage = re.findall(r'"standard_resolution":{"url":"(.*?)"', the_page)
matchCaption = re.findall(r'"caption":(.*?),(.*?),', the_page)
if len(matchImage) > 0:
    for x in xrange(0,len(matchImage)):
    image = matchImage[x].replace('\\','')
    if matchCaption[x][0] == 'null':
        feed['images'].append(image)
        feed['captions'].append('No Caption')
    else:
        caption = re.search(r'"text":"(.*?)"', matchCaption[x][1])
        caption = caption.group(1).replace('\\','')
        feed['images'].append(image)
        feed['captions'].append(caption)

这似乎是一个非常不公平的任务。JSON非常复杂,正则表达式不适合它。请参阅这篇经典文章:-为了提供帮助,您需要编写自己的标记化方法。你肯定不能只用一个正则表达式就完成所有的工作,你需要大量的自定义解析。你为什么要这么做?作为学习的练习?我恰好同意。编写JSON解析器所需的代码并不简单。如果这真的是一项作业,我希望这是一门第四年的软件工程课程或类似课程。这是我第三年的第一学期,课程名称是“编程语言”。课程目标是教我们不同的语言范例(IMepractive、脚本等),以便有更多的工具来面对未来的问题(我的教授的话)。这项作业似乎是为了教我们如何使用功能强大的regex库,但据我所知,它有点失控:P@felipeimm问题是,仅在纯正则表达式中实现一个JOSN解析器是非常重要的(无论使用哪种语言)。在某个时候,你需要解析结构,因此需要编写一个解析器。请参阅下面我的res;onse。感谢您的回复,不幸的是,由于我的教授告诉我们不要使用任何外部库,我无法真正利用此库。但是,我会将此写下来,以备将来需要。再次感谢!您可以借用你需要的库。这基本上是一个递归下降解析器。没有第三方库就不难实现。