re.match(pattern, string, flags=0)
определяется как return
re.compile(pattern, flags).match(string)
Он не может обрабатывать список строк вместо строки, но это достаточно легко исправить с помощью al oop. Но поскольку мы собираемся запускать одно и то же выражение несколько раз, лучше скомпилировать его один раз, а не многократно внутри l oop.
Вот что я бы сделал:
import re
list_num=['AYSGS11458630001111252','1234567','LUPUP003164311E0111644','ABCGFD','AFC123A']
pattern = r"^(([A-Z]{5}[0-9]{17})|([A-Z]{5}[0-9]{9}[A-Z]{1}[0-9]{7}))$"
compiled_pattern = re.compile(pattern)
for m in map(compiled_pattern.match, list_num):
#you could also use pattern.fullmatch, and not enclose your pattern with ^ and $
if m is not None:
print(m.string)
else:
print(m)
## shows:
##AYSGS11458630001111252
##None
##LUPUP003164311E0111644
##None
##None
Или еще:
x = [m.string if isinstance(m, re.Match) else m
for m in map(compiled_pattern.match, list_num)]
print (x)
#['AYSGS11458630001111252', None, 'LUPUP003164311E0111644', None, None]
'or even this:'
def multi_match(pattern, seq):
compiled_pattern=re.compile(pattern)
return [m.string if isinstance(m, re.Match) else m
for m in map(compiled_pattern.match, list_num)]
print(multi_match(pattern, list_num))
#['AYSGS11458630001111252', None, 'LUPUP003164311E0111644', None, None]
Или, если позиции индекса не нужно сохранять, что-то вроде:
def filter_match(pattern, seq):
compiled_pattern=re.compile(pattern)
return list(filter(
lambda line: compiled_pattern.match(line) is not None,
list_num))
print(filter_match(pattern, list_num))
#['AYSGS11458630001111252', 'LUPUP003164311E0111644']