Точное соответствие pattern в string
У меня есть pattern="МАШИНА". Строка, в которой нужно искать равна, например, "ВОРОНА, МАШИНАН, МАШИНА", либо "МАШИНАН, МАШИНА". Может быть и 3 разных слова, но pattern остается тем же. Алгоритм идет по таким строкам построчно, то есть проверяет, есть ли МАШИНА в строке "ВОРОНА, МАШИНАН", далее в строке "ЗАЯЦ, МАШИНАН" и валится на том, что берет первую строку, хотя должен вторую по точному соответствию.
Мне нужно проверить, входит ли в точности pattern в string. Оператор in не работает, поскольку он проверяет посимвольно и вернет не ту строку. Мне нужно именно точное соответствие. Пробовал через re.search(pattern=f"\s^{name}$\s", string=string), но в регулярных выражениях не силен, а времени в данный момент разбираться нет. Как написать правильное регулярное выражение / Или есть решение, которое работает быстрее
Минимально воспроизводимый пример
import re
def main():
strings = [
"300С",
"300СА",
"350СБ, 200А",
"300Б, 200БД",
"300Б, 200Б"
]
pattern = "200Б"
# Выведет первую строку, но мне нужна вторая, то есть 300Б, 200Б
# Строка может прилететь и "200Б, 300Б". Нужно точное соответствие
for string in strings:
if re.search(pattern=f"{pattern}", string=string):
print(pattern, "---", string)
return "Success"
if __name__ == "__main__":
main()
Ответы (2 шт):
Все понятно. f"\W(МАШИНА)\W" у вас не работало, потому что у вас паттерн в конце строки, а \W конец строки не учитывает. Вот так должно работать:
pattern=f"(^|\W){pattern}(\W|$)"
Используйте такой шаблон:
pattern=fr"\b{pattern}\b"
Объяснение: \b - это шаблон для границы слова.
Но кроме того обратные слэши нужно либо экранировать ещё одним бэкслэшэм, либо использовать "сырые" r-строки.