我有一个长字符串,其中包含这种格式的键值:
"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"
我想获取所有“信息”键的值(= infotexts)。如何才能做到这一点?
使用 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"
只要您infotext
不包含(转义)引号,您就可以尝试这样的事情:
>>> m = re.findall(r'"info":"([^"]+)', str)
>>> m
['infotext', 'infotext2', 'infotext3']
我们简单地匹配"info":"
然后尽可能多的非"
字符(被捕获并因此返回)。
使用这个正则表达式(?<="info":")(.+?)(?=")
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']