Подсчет нескольких строк с использованием регулярных выражений в нескольких файлах

#python #regex #count

#python #регулярное выражение #подсчет

Вопрос:

Я пытаюсь подсчитать, сколько раз «тип» появляется в текстовом файле, и мне нужно включить следующее слово. Например, сколько раз «введите A» или «введите яблоки» отображается в нескольких файлах. Я зашел так далеко, но вместо подсчета он показывает по одному для каждого. Я подумал, что было бы лучше хранить в словаре, чтобы я мог ввести, а затем посчитать.

 current output

file 1.txt {type A : 1}
file 1.txt {type A : 1}
file 2.txt {type apples : 1}
file 2.txt {type apples : 1}
  

Однако это то, что я хотел бы. Я новичок в python, поэтому чувствую, что я упускаю что-то очевидное.

 expected output

file 1.txt {type A : 2}
file 2.txt {type apples : 2}
  

это код, который у меня есть до сих пор

 def find_files(d):
   for root, dirs, files in os.walk(d):
       for filename in files:
           if filename.endswith('.txt'):
               yield os.path.join(root, filename)

for file_name in find_files(d):
    with open(file_name, 'r') as f: 
        for line in f:
             results = defaultdict(int)
             line = line.lower().strip()
             match = re.search('type (S )', line)
             if match:
                results[match.group(0)]  = 1
                print(file_name, results)
  

Комментарии:

1. Создайте словарь с соответствующими текстовыми ключами, которые сопоставляются с целочисленным значением, которое подсчитывает, сколько раз оно было просмотрено. Выполнение этого можно было бы несколько упростить, используя a collections.defaultdict(int) , который является dict подклассом.

Ответ №1:

Несколько ошибок:

  • вы создаете новый словарь для каждой строки; лучше создать один для каждого файла
  • re.search найдет первое совпадение в строке; вы могли бы использовать re.findall , чтобы найти все совпадения

Вот исправленная версия вашего кода:

 for file_name in find_files(d):
    with open(file_name, 'r') as f:
        results = defaultdict(int)
        for line in f:
             line = line.lower().strip()
             matches = re.findall('type (S )', line)
             if matches:
                for word in matches:
                    results[word]  = 1
        print(file_name, results)