Сохранить все результаты из объекта pattern.finditer () - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно захватить и вернуть список всех совпадений шаблона регулярного выражения. Рассмотрим следующий пример:

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)

Печатный словарь results возвращает следующее:

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

Объект соответствия сохраняет только последний сопоставленный объект, когда я присваиваю результат словарю. Если я использую список и добавляю, l oop объединяет все совпадения итеративно, что также неверно. Как сохранить все совпадения в списке?

1 Ответ

1 голос
/ 05 марта 2020

Словарь не может содержать несколько ключей с одинаковым идентификатором, поэтому первые результаты 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']})
...