У меня есть список слов и строка, и я хотел бы получить список слов из исходного списка, найденных в строке.
Бывший:
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']
Каким-то образом совпадение между понятиями «автомобиль» и «производитель автомобилей» кажется источником этой проблемы.
Любые идеи, как преодолеть это?
Большое спасибо
Текущий код можно исправить, если сначала отсортировать 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']
Я реализовал ваше решение, и оно действительно работает. Большое спасибо за помощь.
regex
обязательно?