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使它更简单。我必须记住他们