我有一个这种格式的词典列表字典(是的,预期'元素中没有逗号)。
mydict = {
'labyrinth': [
{
u'content': u'something',
u'expected': u''
},
{
u'content': u'somethingelse',
u'expected': u'thistext\n user ID: a.b.c\n user ID: e.f.g\n'
},
{
u'content': u'blah',
u'expected': u'a. Path:somepath\n user ID: b.c.d\n'
}
]
}
我必须从上面的迷宫中提取所有用户ID。
我尝试了一些解决方法来最小化数据:
anodict=mydict['labyrinth'][1].copy() #Just the second dictionary from the list for example
print anodict['expected']
给我这个unicode字符串:
u'a. Path:somepath\n user ID: b.c.d\n
我再次不确定如何从这种奇怪的格式中单独提取用户ID。 如何在上面的dicts列表中仅过滤包含用户ID的词典,以及如何在单独的词典列表中单独提取用户ID及其值? 请帮忙。
答案 0 :(得分:1)
上面的示例数据语法不正确。
所以这是我的更新:
mydict = {
'labyrinth': [
{
u'content': u'something',
u'expected': u''
},
{
u'content': u'somethingelse',
u'expected': u'thistext\n user ID: a.b.c\n user ID: e.f.g\n'
},
{
u'content': u'blah',
u'expected': u'a. Path:somepath\n user ID: b.c.d\n'
}
]
}
从列表索引中获取任何dict对象。例如:2
>>> anodict=mydict['labyrinth'][2]
现在导入re
以匹配字符串
>>> import re
>>> anodict
{u'content': u'blah', u'expected': u'a. Path:somepath\n user ID: b.c.d\n'}
>>> re.search(r'ID\:\s([\w\.]+)', anodict['expected']).group(1)
u'b.c.d'
此处u'b.c.d'
是您想要的结果。
我希望这会对你有所帮助。
答案 1 :(得分:1)
上一个答案不一定会在一行中找到多个ID。
您可以使用re.findall从字符串
中提取多个IDimport re
ids = []
for dict_ in mydict["labyrinth"]:
ids.extend(re.findall(r"ID: (\w\.\w.\w)", dict_["expected"]))
答案 2 :(得分:1)
你的问题是:
...如何单独提取用户ID及其值 dicts列表?
这是一些非正则代码,它实际上会生成所需的词典列表:
mydict = {'labyrinth': [{u'content': u'something', u'expected': u''},
{u'content': u'somethingelse', u'expected': u'thistext\n user ID: a.b.c\n user ID: e.f.g\n'},
{u'content': u'blah', u'expected': u'a. Path:somepath\n user ID: b.c.d\n'}]}
ids = []
for d in mydict['labyrinth']:
expected = d.get('expected', '').split()
ids.extend([{'user_id': expected[i+1]} for i, s in enumerate(expected) if s == 'ID:'])
print ids
<强>输出强>
[{'user_id': u'a.b.c'}, {'user_id': u'e.f.g'}, {'user_id': u'b.c.d'}]
上面是一个稍微严格的版本:
ids = []
for d in mydict['labyrinth']:
expected = d.get('expected', '').split()
for i, s in enumerate(expected):
if s == 'ID:':
ids.append({'user_id:': expected[i+1]})
print ids