Регулярное выражение Python, соответствующее нескольким словам из списка

У меня есть список слов и строка, и я хотел бы получить список слов из исходного списка, найденных в строке.

Бывший:

import re

lof_terms = ['car', 'car manufacturer', 'popular']
str_content = 'This is a very popular car manufacturer.'

pattern = re.compile(r"(?=(\b" + r"\b|".join(map(re.escape, lof_terms)) + r"\b))")
found_terms = re.findall(pattern, str_content)

Это вернет только ['car', 'popular']. Он не может поймать «производителя автомобилей». Однако он поймает его, если я изменю исходный список терминов на lof_terms = ['car manufacturer', 'popular']

Каким-то образом совпадение между понятиями «автомобиль» и «производитель автомобилей» кажется источником этой проблемы.

Любые идеи, как преодолеть это?

Большое спасибо

regex обязательно?

Mr. Hobo 14.12.2020 15:10
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Текущий код можно исправить, если сначала отсортировать lof_terms по длине в порядке убывания:

rx = r"(?=\b({})\b)".format("|".join(map(re.escape, sorted(lof_terms, key=len, reverse=True))))
pattern = re.compile(rx)

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

Посмотрите демо Python:

import re

lof_terms = ['car', 'car manufacturer', 'popular']
str_content = 'This is a very popular car manufacturer.'

rx = r"(?=\b({})\b)".format("|".join(map(re.escape, sorted(lof_terms, key=len, reverse=True))))
pattern = re.compile(rx)
found_terms = re.findall(pattern, str_content)
print(found_terms)
# => ['popular', 'car manufacturer']

Я реализовал ваше решение, и оно действительно работает. Большое спасибо за помощь.

davep 14.12.2020 15:49

Другие вопросы по теме