Регулярные выражения - Создание списка путем извлечения слов из текста

Пример:

myList = []
text = ["salmonella in black pepper from brazil", "aflatoxins in fish from germany", "pseudomonas in meat from italy"]
findmatches = re.compile(r"\b" +
                         r"\b|\b".join(re.escape(hazard) for hazard in hazards_set) +
                         r"\b")

for i in text:
    for possible_match in set(findmatches.findall(i)):
        if possible_match in hazards_set:
            myList.append(possible_match)
    myList.append("")

print(myList)

Вот что я получаю: ['salmonella', '', 'aflatoxins', '', '']

Вот что я хотел бы получить: ['salmonella','aflatoxins', ''] так как «псевдомонада» отсутствует в наборе hazards_set.

Как я могу решить проблему?

что такое hazards_set?

God Is One 15.02.2023 16:56

Создайте свой минимальный воспроизводимый пример и добавьте его к своему вопросу.

PM 77-1 15.02.2023 16:58
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Установите условие if для первого for-loop, используя .isdisjoint(), чтобы добавить соответствующую пустую строку.

myList = []
text = ["salmonella in black pepper from brazil", "aflatoxins in fish from germany", "pseudomonas in meat from italy"]
findmatches = re.compile(r"\b" +
                         r"\b|\b".join(re.escape(hazard) for hazard in hazards_set) +
                         r"\b")
# e.g
hazards_set = ['brrrrrrrr', 'aflatoxins', 'salmonella']
for i in text:
    for possible_match in set(findmatches.findall(i)):
        if possible_match in hazards_set:
            myList.append(possible_match)
    if set(findmatches.findall(i)).isdisjoint(hazards_set): 
        myList.append("")

print(myList)

['salmonella', 'aflatoxins', '']

Вы также можете улучшить код, используя понимание списка и re.finditer() с другим шаблоном re.

myList = [match.group(0) for i in text 
          for match in re.finditer(r'\b(?:%s)\b' % '|'.join(hazards_set), i)]
myList +=[''] * (len(text) - len(myList))
print(myList)

Будет давать тот же результат, что и при традиционном подходе с циклом for и append. Примечание. Я предполагаю, что hazards_set может быть списком слов, например:

hazards_set = ['brrrrrrrr', 'aflatoxins', 'salmonella']

или набор слов типа:

hazards_set = {'brrrrrrrr', 'aflatoxins', 'salmonella'}

Теперь код работает правильно, спасибо!

Davide 16.02.2023 16:36

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