Python:搜索正则表达式的dict值

时间:2014-01-24 05:18:14

标签: python regex

如何搜索字典对象中的所有值?我在下面的括号中尝试了json3[]json3json3.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

4 个答案:

答案 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())