Я думаю, ваша концепция использования регулярных выражений нуждается в некотором улучшении.
Обратите внимание, что каждая строка ввода содержит несколько "токенов", например, terörizm+Noun+Gen
.Как видите, он содержит:
- первое слово - фактическое слово из текста,
- количество символов классификации , каждому из которых предшествует
+
char.
Итак:
- каждая строка должна быть разбита на токены, на последовательности пустых символов:
- каждый токен должен быть разбит наслова, на
+
char, - первое из этих слов является "фактическим" словом,
- остальные слова (без
+
) являются классификационными символами.
Хорошая привычка - обрезать завершающие пустые символы (не менее \n
).
Обратите внимание, что ваш код содержит StringList
, поэтому вы знаете, что эта функция может выглядетьдля одного или нескольких классификационных слов.
Я запрограммировал его немного по-другому:
- Второй параметр (
lookFor
) - список слов, который преобразуется в набор (lookForSet
). - набор слов (результат разбиения токена, мinus первое слово) также преобразуется в набор.
Решение о том, печатать ли слово (первое слово из токена), основано на том, можно ли найти хотя бы один из его классификационных символов.в lookForSet
.Другими словами, есть ли у lookForSet
и wordSet
общие элементы (установить пересечение).
Таким образом, весь сценарий может выглядеть следующим образом:
import re
def index(fileName, lookFor):
lookForSet = set(lookFor) # Set of classification symbols to look for
pat1 = re.compile(r'\s+') # Regex to split line into tokens
pat2 = re.compile(r'\+') # Regex to split a token into words
with open(fileName) as f:
for lineNo, line in enumerate(f, start=1):
line = line.rstrip()
tokens = pat1.split(line)
for token in tokens:
words = pat2.split(token)
word1 = words.pop(0) # Initial word
wordSet = set(words) # Classification words
commonWords = lookForSet.intersection(wordSet)
if commonWords:
print("{:3}: {:<15} {}".format(lineNo, word1, ', '.join(commonWords)))
index('lines.txt', ['Noun', 'Gen'])
ЧастьВыход из него, для моих входных данных (немного сокращенная версия), как показано ниже:
1: Türkiye Noun
1: terörizm Noun, Gen
1: kitle Noun
1: imha Noun
2: Türkiye Noun, Gen
2: potansiyel Noun
Он содержит:
- номер строки источника,
- первое слово токена,
- какие слова классификации из
lookFor
были найдены в этом токене.