Фильтровать и сортировать список с помощью регулярных выражений в python

#python #regex #python-2.7

#python #регулярное выражение #python-2.7

Вопрос:

Я пытаюсь отфильтровать список, чтобы получить соответствующий элемент из шаблона с регулярным выражением, я хочу получить следующее совпадение, если первый шаблон не существует.

Что у меня есть сейчас

 all_list= ["FOO tic FOO", "BAR toc", "FOO BAR" ]
pattern = ".*tic.*"
filter_list = filter(lambda x: re.findall(pattern,x),all_list)
print filter_list
 

это дает мне

 ["FOO tic FOO"]
 

Я хочу, чтобы, если FOO tic FOO не существует в списке, который я хочу найти для следующего шаблона, я пробовал это

 all_list= ["FOO FOO FOO", "BAR toc", "FOO BAR" ]
pattern = ".*tic.*|.*toc"
filter_list = filter(lambda x: re.findall(pattern,x),all_list)
print filter_list
 

результат, как и ожидалось

 ['BAR toc']
 

но проблема в том, что когда в списке есть оба элемента, соответствующие шаблону, я получаю оба в результате, где я хочу, чтобы тот, который соответствует первому шаблону.

 all_list= ["BAR toc","FOO tic FOO", "FOO BAR" ]
pattern = ".*tic.*|.*toc"
filter_list = filter(lambda x: re.findall(pattern,x),all_list)
print filter_list
 

результат

 ['BAR toc', 'FOO tic FOO']
 

Я ожидаю
['FOO tic FOO'] или список всех совпадений в том же порядке, что и в шаблоне, ['FOO tic FOO','BAR toc'] чтобы я мог получить элемент по его индексу, например filter_list[0]

Комментарии:

1. | означает «ИЛИ» в регулярных выражениях. Если вы хотите что-то вроде «если … тогда … else», затем вы должны сделать это вне регулярного выражения, используя 2 отдельных регулярных выражения.

2. Спасибо за немедленный ответ, да, это будет мой последний вариант, мне было интересно, есть ли какой-нибудь более простой способ добиться этого.

3. Я думаю, вы можете перечислить несколько шаблонов и отфильтровать список, начиная с первого шаблона. Если отфильтрованный список пуст, используйте второй шаблон.

Ответ №1:

Вы могли бы перечислить шаблоны и зациклить их. После фильтрации проверьте, есть ли результат.

Если его нет, перейдите к следующему шаблону, иначе получите результат.

 import re

patterns = [
    r".*bticb",
    r".*btocb"
]

all_list= ["BAR toc","FOO tic FOO", "FOO BAR"]
for pattern in patterns:
    filter_list = list(filter(lambda x: re.search(pattern, x), all_list))
    if len(filter_list) > 0:
        print(filter_list)
        break
 

Вывод

 ['FOO tic FOO']
 

Демонстрация Python