Регулярное выражение для сопоставления всех строк из нескольких списков - PullRequest
0 голосов
/ 04 февраля 2020

Я использую регулярное выражение для сопоставления всех строк из списка.

import re

brand_list = ['scurfa', 'seagull', 'seagull', 'seiko']

regular_expression = rf"({'|'.join(brand_list)}) ([^\s]+)"

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
"""

print([" ".join(t) for t in re.findall(regular_expression, soup_content.find('blockquote', { "class": "postcontent restore" }).text, re.IGNORECASE)])

Я получил эти

['SEIKO 44-9990', 'Seiko NE57', 'ScURFA 42342']

Но я хочу заменить ([^\s]+) на эту ({'|'.join(model_list)}) на основе в этом списке

model_list = ['44-9990 Gold Medallion', 'NE57 auto', '42342 ']

Таким образом, я могу получить вывод, похожий на этот

['SEIKO 44-9990 Gold Medallion', 'Seiko NE57 auto', 'ScURFA 42342']

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Вы можете сделать это точно так же, как и другие регулярные выражения:

regular_expression = rf"({'|'.join(brand_list)}) *({'|'.join(model_list)})?"

Вывод:

['SEIKO 44-9990 Gold Medallion', 'Seiko NE57 auto', 'ScURFA 42342']

* в регулярном выражении между двумя объединениями в списке означает, что он соответствует обоим, с пробелом или без.

РЕДАКТИРОВАТЬ:

Полный код, который я использовал для тестирования:

import re

brand_list = ['scurfa', 'seagull', 'seagull', 'seiko']
model_list = ['44-9990 Gold Medallion', 'NE57 auto', '42342']

regular_expression = rf"({'|'.join(brand_list)}) *({'|'.join(model_list)})?"

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
"""

print([" ".join(t) for t in re.findall(regular_expression, description, re.IGNORECASE)])

РЕДАКТИРОВАТЬ 2:

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

1 голос
/ 04 февраля 2020

Код можно исправить с помощью

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...