@rsytrade

Как найти нужное значение соответствующее одному из вариантов регулярного выражения?

Необходимо проверить/найти в str(source_name) соответствующие выражения, с помощью набора паттернов regex (patterns). Пытаюсь это сделать одно строкой с использованием комбинации filter+lambda
pat_1 = r'[А-В]Т\-[А-В]Ш\-[А-В]Д'
pat_2 = r'[А-В]Т\-[А-В]Ш'
pat_3 = r'[А-В]\-[А-В]Ш'
pat_4 = r'\s[А-В]\-'
pat_5 = r'\/[А-В]\-'
patterns = [pat_1, pat_2, pat_3, pat_4, pat_5]
print(''.join(filter(bool, map(lambda cr: re.search(cr, source_name),  patterns))))


Но почему-то не срабатывает, при это сами паттерны (если использовать по отдельности) рабочие...
где ошибка? и есть ли вариант сократить эту комбинацию?
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Необходимо проверить/найти

Так найти или проверить ?

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

В общем разбей задачу на части а потом уже городи всякие однострочники

Исходные данные

import re
source_name = '34234 334234'

pat_0 = r'\d+'
pat_1 = r'[А-В]Т\-[А-В]Ш\-[А-В]Д'
pat_2 = r'[А-В]Т\-[А-В]Ш'
pat_3 = r'[А-В]\-[А-В]Ш'
pat_4 = r'\s[А-В]\-'
pat_5 = r'\/[А-В]\-'
patterns = [pat_0, pat_1, pat_2, pat_3, pat_4, pat_5]


# Проверить
found = False
for p in patterns:
    if re.search(p, source_name):
        found = True
        break;
if found:
    print("Yes")
else:
    print("No")

# Найти
for f in list(map(lambda p: re.findall(p, source_name),  patterns)):
    for v in [i for i in f if f]:
        print(v)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы