2014-01-24 60 views
1

如何搜索字典對象中的所有值?我在下面的括號中嘗試了json3[],json3json3.values(),其中有5個問號。Python:通過字典的值搜索正則表達式

我當前的代碼:

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 
+1

'json3'看起來像什麼? – falsetru

+0

http://xkcd.com/info.0.json – ZuluDeltaNiner

+0

預期結果是什麼? TRUE; /'FALSE'?鍵對應匹配的值?匹配值? – falsetru

回答

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()) 
0

假設比賽不能交叉的價值觀和你的數據是平的(在你的迴應沒有嵌套的字典,你需要檢查)那麼你可以簡單地做到這一點:

matches = [title_pattern.search(val) \ 
       for val in json3.values() if isinstance(val, (str, unicode))] 
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')] 
0

您的JSON似乎只是在它的值的字符串,那麼你可以簡單地做:

map(title_pattern.search, json3.values()) 
+0

我仍然從這個 – ZuluDeltaNiner

+0

嗯,有一個'int'在那裏'TypeError',看到@SeanViera回答,他說得對 –