Код можно исправить с помощью
import re
brand_list = ['scurfa', 'seagull', 'seiko']
description = """
VINTAGE KING SEIKO 44-9990 Gold Medallion,Manual Winding with mod caseback.Serviced 2019.
Power reserve function at 12; push-pull crown at 4
Seiko NE57 auto movement with power reserve
Multilayered dial with SuperLuminova BG-W9
Testing for a ScURFA 42342
"""
model_list = ['44-9990 Gold Medallion', 'NE57 auto', '42342']
regular_expression = rf"(?:{'|'.join(brand_list)})(?:\s+(?:{'|'.join(model_list)}))?"
print(re.findall(regular_expression, description, re.IGNORECASE))
Вывод: ['SEIKO 44-9990 Gold Medallion', 'Seiko NE57 auto', 'ScURFA 42342']
См. онлайн Python демо
The rf"(?:{'|'.join(brand_list)})(?:\s+(?:{'|'.join(model_list)}))?"
part создает шаблон (?:scurfa|seagull|seiko)(?:\s+(?:44-9990 Gold Medallion|NE57 auto|42342))?
(см. его онлайн-демонстрацию ), который соответствует scurfa
, seagull
или seiko
, затем необязательно 1 или более пробелов, а затем 44-9990 Gold Medallion
, NE57 auto
или 42342
.
Вам не нужно понимание списка, если вы используете группы без захвата, используйте re.findall(regular_expression, description, re.IGNORECASE)
с шаблоном.
Чтобы сопоставить фразы как целые слова, рассмотрите возможность добавления границ слов:
regular_expression = rf"\b(?:{'|'.join(brand_list)})(?:\s+(?:{'|'.join(model_list)}))?\b"