2

我有一个巨大的字符串,其中包含许多集合,每个集合由,. 每个集合中都有键值对,每对由 . 分隔&

这是一个小例子,

tag=43&id=8787&type=video/webm;+codecs="vp8.0,+vorbis"&quality=medium,type=video/webm;+codecs="vp8.0,+vorbis"&quality=medium&tag=172&id=8978,tag=41&type=video/webm;+codecs="vp8.0,+vorbis"&id=1738&quality=medium

该字符串具有以下集合(3 个集合,每个集合以 分隔,):

tag=43&id=8787&type=video/webm;+codecs="vp8.0,+vorbis"&quality=medium

type=video/webm;+codecs="vp8.0,+vorbis"&quality=medium&tag=172&id=8978

tag=41&type=video/webm;+codecs="vp8.0,+vorbis"&id=1738&quality=medium

我想编写一个正则表达式将原始字符串拆分为键值对集。我试过这个,

sets = huge_string.split(',')

但显然这是行不通的,因为在一个键值对中也有一个逗号:

type=video/webm;+codecs="vp8.0,+vorbis" # <--- this is causing problem!

,是引起问题的原因。

如何编写正则表达式来完成这项任务?我正在使用Python 3.3.1.

现在我不知道会有多少对,以及以什么顺序。

4

1 回答 1

3

这就是我将如何解析Youtube API 的响应

# content is a str that stores the content of the link
query = urllib.parse.parse_qs(content)

fullurls = query['url_encoded_fmt_stream_map'][0].split(',')
data = [urllib.parse.parse_qs(i) for i in fullurls]
print(data)

这将输出一个dict存储每个链接的所有信息的列表。当然,上面的代码是一个概念演示。应减少假设,并应在实际代码中添加检查。

Youtube API 返回一个 MIME 类型的响应application/x-www-form-urlencoded,所以我们需要使用urllib.parse.parse_qs它来解码它。

键包含值,url_encoded_fmt_stream_map它是以逗号分隔URL 编码字符串列表,因此我们需要将其沿逗号拆分,并使用 解码每个标记urllib.parse.parse_qs。不用担心编解码器描述中的逗号,因为它们已经是 URL 编码的,因此不会干扰拆分。

于 2013-05-06T10:14:33.667 回答