Библиотека "re"

С помощью импорта библиотеки "re" нужно проверить серийный номер на подлинность.
При этом буквенная часть должна состоять только из русско-английских букв.
Пример: A, B, C, E, H, K, M, O, P, T, X, Y


import re
a = input()  #A000AA
f = re.fullmatch( r'\w{1}*([ABCEHKMOPTXY])\d{3}\w{2}*([ABCEHKMOPTXY])', a)
print('Rigth' if f else 'Wrong')

Если основную чать оставить без [ABCEHKMOPTXY], то все заработает, правда вводить можно любые буквы
re.fullmatch( r'\w{1}\d{3}\w{2}', a)
Помогите усовершенствовать
Пример:
A000BC T599OX Y200CE E666MN => Right
S000VC W599JX U200SD Q666ZA => Wrong


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

\w используется для поиска любых букв, цифр и знака нижнего подчёркивания. Тут \w не нужен, так как разрешены только определённые буквы.

\w{1} — это то же самое, что \w, а \w{1}* — навалидный шаблон, нельзя в Python re квантифицировать квантификаторы ("сверхжадные" квантификаторы, такие как ++, ?+, *+, не поддерживаются).

Используйте

import re
a = 'A000AA'

pattern = r'[ABCEHKMOPTXY]\d{3}[ABCEHKMOPTXY]{2}'
print( bool(re.fullmatch( pattern, a)) )
# => True

См. пример работы программы

Если такие шаблоны часто повторяются, можно объявить эти шаблоны как переменные, а потом собрать регулярное выражение:

b = '[ABCEHKMOPTXY]'             # Определим шаблон для разрешённых букв
pattern = rf'{b}\d{{3}}{b}{{2}}' # Задаём регулярное выражение

См. пример работы программы #2

→ Ссылка