Вопрос или проблема
У меня есть много текстовых файлов, которые содержат синтаксис, такой как <Example><EG1>...<Eg1>
. Все это можно захватить с помощью регулярного выражения.
Большинство текстовых редакторов могут выполнять поиск слов с помощью регулярных выражений.
Я хочу искать несколько регулярных выражений и вместо результатов поиска я хочу получить отчеты о количестве слов.
Например, если я найду слово, начинающееся с <
и заканчивающееся на >
, результат должен выглядеть так:
Поиск | Количество
<Example> 100
<Eg1> 100
<Antoerh>
вместо того, чтобы показывать список выделенных результатов поиска с текстом.
Существуют ли какие-либо программы для текстового поиска и аналитики?
Если это разовая задача, я бы воспользовался grep -R '<[^>]*>' /path/to/files
и сохранил результат в текстовом файле, чтобы посчитать количество позже. Если это задача, которую нужно будет выполнять несколько раз, я бы подумал о использовании xapian или swish-e.
xapian может индексировать все файлы в базу данных, а затем вы можете искать в этой базе данных, используя регулярное выражение. Другим преимуществом этого является то, что, индексируя все файлы сначала, вам не нужно знать, какое регулярное выражение вам нужно будет применить (и обновление происходит относительно быстро и намного быстрее, чем выполнение другого полного grep по всем файлам).
Когда в последний раз мне нужно было сделать это, я написал быстрый скрипт на Python, который создавал/обновлял базу данных, и второй скрипт, который позволял мне проводить поиск, он выглядел примерно так:
#!/usr/bin/env python
# xapian-search ver. 20180118111418 Copyright 2018 alexx, MIT License
# Импортируем модуль os для управления файловой системой
import os,sys
# Установим путь к базе данных
databasePath = os.path.abspath('xapian-database')
# Импортируем Python-биндинги Xapian
import xapian
# Создаем базу данных Xapian
database = xapian.Database(databasePath)
xapian_file_name = 0
xapian_file_path = 1
def search(queryString):
# Парсим строку запроса
queryParser = xapian.QueryParser()
queryParser.set_stemmer(xapian.Stem('english'))
queryParser.set_database(database)
queryParser.set_stemming_strategy(xapian.QueryParser.STEM_SOME)
query = queryParser.parse_query(queryString)
# Устанавливаем смещение и лимит для постраничного отображения
offset, limit = 0, database.get_doccount()
# Начинаем сессию запроса
enquire = xapian.Enquire(database)
enquire.set_query(query)
# Отображаем совпадения
matches = enquire.get_mset(offset, limit)
for match in matches:
delim = ''
path = match.document.get_value(xapian_file_path)
if not str(path).endswith("https://softwarerecs.stackexchange.com/"):
delim = "https://softwarerecs.stackexchange.com/"
fileName="unknown"
print('%s%s%s' % (path.decode("utf-8"), delim, match.document.get_value(xapian_file_name)))
#print 'Количество документов, соответствующих запросу: %s' % matches.get_matches_estimated()
#print 'Количество возвращенных документов: %s' % matches.size()
search(str(sys.argv[1:]))
Я не могу опубликовать скрипт, который создал базу данных (из-за лицензии), но не помню, чтобы это было сложно написать. Поскольку это Python, вы можете получить вывод в удобном для вас формате.
Ответ или решение
Для решения вашей задачи по поиску текста с использованием регулярных выражений и составлению аналитического отчета о количестве слов, я предлагаю рассмотреть несколько подходов.
1. Использование командной строки с grep
Если задача является одноразовой, вы можете использовать команду grep
в Linux или macOS. Например, команда:
grep -Ro '<[^>]*>' /path/to/files | sort | uniq -c
Эта команда выполнит рекурсивный поиск файлов в указанной директории и выведет количество уникальных совпадений для шаблона, который начинается с <
и заканчивается на >
. Команда sort
сортирует результаты, а uniq -c
подсчитывает количество повторений.
2. Скрипт на Python
Если вам нужно сделать это несколько раз, то рекомендуем написать Python-скрипт. Ниже приведен пример кода для подсчета вхождений регулярного выражения:
import re
import os
from collections import Counter
def count_tags_in_files(directory):
tag_pattern = r'<[^>]*>'
tag_counts = Counter()
# Обход всех файлов в директории
for root, _, files in os.walk(directory):
for file in files:
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
contents = f.read()
tags = re.findall(tag_pattern, contents)
tag_counts.update(tags)
except Exception as e:
print(f'Не удалось прочитать файл {file_path}: {e}')
return tag_counts
def print_report(tag_counts):
print("Search | Counts")
for tag, count in tag_counts.items():
print(f"{tag} | {count}")
directory_path = '/path/to/your/files' # замените на ваш путь
tag_counts = count_tags_in_files(directory_path)
print_report(tag_counts)
3. Использование Xapian
Если ваша работа с регулярными выражениями и подсчетами будет постоянной, рассмотрите использование Xapian или Swish-e для индексации файлов и последующего выполнения поисковых запросов. Как упоминалось в ответе, Xapian позволяет индексировать файлы и выполнять поиск с использованием регулярных выражений, что значительно ускоряет процесс поиска.
Вот пример, как вы можете создать поиск с использованием библиотеки Xapian:
- Убедитесь, что у вас установлены пакеты
xapian
иxapian-bindings
для Python. - Создайте базу данных и индексируйте ваши файлы.
- Запустите поисковый скрипт аналогично приведенному выше Python коду.
Заключение
Каждый из подходов, описанных выше, имеет свои преимущества и недостатки. Выбор подхода зависит от ваших конкретных требований и того, насколько часто вам нужно выполнять подобные задачи. Если это одноразовая операция, использование grep
будет самым быстрым и простым решением. Если же это регулярная нужда, стоит рассмотреть вариант с написанием скрипта на Python или использование Xapian для автоматизации процесса.