Пример:
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.
Как я могу решить проблему?
Создайте свой минимальный воспроизводимый пример и добавьте его к своему вопросу.
Установите условие 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'}
Теперь код работает правильно, спасибо!
что такое
hazards_set
?