1

我有一个长字符串,其中包含这种格式的键值:

"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"

我想获取所有“信息”键的值(= infotexts)。如何才能做到这一点?

4

4 回答 4

4

使用 json,卢克

s = '"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"'

import json

def pairs_hook(pairs):
    return [val for key, val in pairs if key == 'info']

p = json.loads('{' + s + '}', object_pairs_hook=pairs_hook)
print p # [u'infotext', u'infotext2', u'infotext3']

文档

object_pairs_hook 是一个可选函数,将调用使用有序对列表解码的任何对象文字的结果。将使用 object_pairs_hook 的返回值而不是 dict。

只是为了完整起见,这里有一个做同样的正则表达式:

rg = r'''(?x)

    "info"
    \s* : \s*
    "
        (
            (?:\\.|[^"])*
        )
    "
'''
re.findall(rg, s) # ['infotext', 'infotext2', 'infotext3']

这也处理字符串中的空格:和转义引号,例如

 "info"  :   "some \"interesting\" information"
于 2012-11-17T19:41:17.300 回答
3

只要您infotext不包含(转义)引号,您就可以尝试这样的事情:

>>> m = re.findall(r'"info":"([^"]+)', str)
>>> m
['infotext', 'infotext2', 'infotext3']

我们简单地匹配"info":"然后尽可能多的非"字符(被捕获并因此返回)。

于 2012-11-17T19:37:54.303 回答
0

使用这个正则表达式(?<="info":")(.+?)(?=")

于 2012-11-17T19:38:41.870 回答
0
In [140]: import re

In [141]: strs='''"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"'''

In [146]: [x.split(":")[-1].strip('"') for x in  re.findall(r'"info":"\w+"',strs)]
Out[146]: ['infotext', 'infotext2', 'infotext3']
于 2012-11-17T19:40:55.657 回答