Python 保存pattern.finditer()对象的所有结果
我需要捕获并返回正则表达式模式的所有匹配项的列表。考虑下面的例子:Python 保存pattern.finditer()对象的所有结果,python,dictionary,Python,Dictionary,我需要捕获并返回正则表达式模式的所有匹配项的列表。考虑下面的例子: text_dict = {'text1':'1234abc456', 'text2':'123abe456xyz', 'text3':'123abd456'} text_find = re.compile('\D+') results = {} for key, val in text_dict.items(): for match in text_find.finditer(val): results
text_dict = {'text1':'1234abc456', 'text2':'123abe456xyz', 'text3':'123abd456'}
text_find = re.compile('\D+')
results = {}
for key, val in text_dict.items():
for match in text_find.finditer(val):
results[key] = match.group(0)
打印的结果
字典返回以下内容:
for k, v in results.items():
print(k,v)
text1 abc
text2 xyz
text3 abd
然而,这是不正确的。结果应与以下打印的报税表一致:
for key, val in text_dict.items():
for match in text_find.finditer(val):
print(f'{key} {match.group(0)}')
text1 abc
text2 abe
text2 xyz
text3 abd
匹配对象仅在我将结果分配给字典时保存最后一个匹配的对象。如果我使用列表和附加,循环将迭代地聚合所有匹配项,这也是不正确的。如何将所有匹配项保存到列表中 字典无法保存多个具有相同id的键,因此text2的第一个结果将被第二个结果覆盖。您可以使用
defaultdict
来解决此问题:
from collections import defaultdict
text_dict = {'text1':'1234abc456', 'text2':'123abe456xyz', 'text3':'123abd456'}
text_find = re.compile('\D+')
results = defaultdict(list)
for key, val in text_dict.items():
for match in text_find.finditer(val):
results[key].append(match.group(0))
print(results)
输出:
defaultdict(list,
{'text1': ['abc'], 'text2': ['abe', 'xyz'], 'text3': ['abd']})
字典不能有重复的键。使用元组列表。请参阅文本2。当您第一次循环告诉dict为text2存储abe时,然后再次循环并告诉dict现在为text2安装了存储xyz。您需要将结果存储在一个列表中,您可以随每个新结果一起附加到该列表中。我总是忘记defaultdict,并且总是在附加行前面添加一些内容,如
如果结果中没有键:results[key]=[]
,这很有效,但deafultdict使它更简单。我必须记住他们