Regex для сопоставления точных слов, которые содержат апострофы в Python? - PullRequest
0 голосов
/ 26 марта 2020

Для целей этого проекта я использую более точные выражения регулярных выражений, а не более общие. Я считаю слова вхождений из списка слов в текстовом файле, который я импортирую в свой скрипт, называемый vocabWords, где каждое слово в списке имеет формат \bword\b.

Когда я запускаю свой скрипт, \bwhat\b подбирает слова "что" и "что есть", но \bwhat's\b не подбирает слова. Если я поменяю порядок слов апострофом перед словом root, слова будут правильно подсчитаны. Как я могу изменить свой список регулярных выражений, чтобы слова считались правильно? Я понимаю, что проблема заключается в использовании "\ b", но я не смог найти, как это исправить. У меня не может быть более общего регулярного выражения, и я должен включить сами слова в шаблон регулярного выражения.

vocabWords:

\bwhat\b
\bwhat's\b
\biron\b
\biron's\b

Мой код:

matched = []
regex_all = re.compile('|'.join(vocabWords))
for row in df['test']:
    matched.append(re.findall(regex_all, row))

Ответы [ 2 ]

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

Есть как минимум еще 2 решения:

  1. Проверить, что следующий символ не является апострофом r"\bwhat(?!')\b"
  2. Использовать более общее правило r"\bwhat(?:'s)?\b", чтобы перехватить оба варианта с помощью / без апострофа.
1 голос
/ 26 марта 2020

Если вы отсортируете свой список слов по длине, прежде чем превратить его в регулярное выражение, более длинные слова (например, «что») будут предшествовать более коротким (например, «что»). Это должно сработать.

regex_all = re.compile('|'.join(sorted(vocabWords, key=len, reverse=True)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...