Несколько регулярных выражений в одной строке - PullRequest
0 голосов
/ 13 февраля 2020
list_num=['AYSGS11458630001111252','1234567','LUPUP003164311E0111644','ABCGFD','AFC123A']

Для вышеупомянутого list_num я хотел написать RE, который выдает put, как показано ниже.

Ожидаемый результат

AYSGS11458630001111252
none
LUPUP003164311E0111644
none
none

В списке должно быть два элемента

Я написал в Интернете, пожалуйста, исправьте и предложите мне.

re.match((r"^(([A-Z]{5}[0-9]{17})|([A-Z]{5}[0-9]{9}[A-Z]{1}[0-9]{7}))$", list_num)

1 Ответ

0 голосов
/ 13 февраля 2020

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']
...