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