如何搜索字典对象中的所有值?我在下面的括号中尝试了json3[]
,json3
和json3.values()
,其中包含5个问号。
我目前的代码:
title = "foo"
title_pattern = re.compile("(?P<title>%s)" % title, flags=re.IGNORECASE)
json3 = json.load(urllib2.urlopen(url3))
match2 = title_pattern.search(?????) # search all values, not keys for json3
输出:
Traceback:
Line #, match2 = title_pattern.search(?????)
TypeError: expected string or buffer
答案 0 :(得分:1)
import re
dictor = {
'key1': 'valX', 'key2' : 'valX1',
'key3': 'valY', 'key4' : 'valX2',
'key5': 'valY3', 'key6' : 'valY4'
}
matches = filter(lambda x : re.search(r'X\d', str(x[1])), dictor.items())
print matches
给出:
[('key2', 'valX1'), ('key4', 'valX2')]
答案 1 :(得分:1)
您不需要使用正则表达式来简单地检查包含的给定字符串。使用in
operator:
>>> 'foo' in 'blah blah'
False
>>> 'foo' in 'blah foo blah'
True
>>> url3 = 'http://xkcd.com/info.0.json'
>>> title = "foo"
>>> json3 = json.load(urllib2.urlopen(url3))
>>> any(isinstance(value, basestring) and title in value for value in json3.itervalues())
False
>>> title = "friends"
>>> any(isinstance(value, basestring) and title in value for value in json3.itervalues())
True
如果您确实需要使用正则表达式,请使用re.escape
转义title
;如果title
包含在正则表达式中具有特殊含义的字符,则会在不转义的情况下获得意外结果。
title_pattern = re.compile("(?P<title>%s)" % re.escape(title), # <---
flags=re.IGNORECASE)
json3 = json.load(urllib2.urlopen(url3))
matched = any(isinstance(value, basestring) and title_pattern.search(value) for value in json3.itervalues())
答案 2 :(得分:0)
假设匹配不能交叉值并且您的数据是平的(您的响应中没有需要检查的嵌套词典),那么您可以简单地执行此操作:
matches = [title_pattern.search(val) \
for val in json3.values() if isinstance(val, (str, unicode))]
答案 3 :(得分:0)
你的json似乎只是在其值中有字符串,然后你就可以了:
map(title_pattern.search, json3.values())