Оператор Walrus для фильтрации поиска по регулярным выражениям в понимании списка

У меня есть список строк Python. Я хочу выполнить поиск по регулярным выражениям для каждого элемента, отфильтровывая только те элементы, для которых мне удалось захватить группу регулярных выражений. Я думаю, что могу выполнить поиск по регулярному выражению только один раз, используя оператор моржа из Python 3.8. Пока у меня есть:

attacks = [match
           for attack in attacks
           if (match := re.search(r"(\([0-9]+d[\s\S]+\))", attack).group() is not None)]

Логика такова: я беру найденную группу, если поиск по регулярному выражению что-то дал, что означает, что это не None. Проблема в том, что поведение странное - я могуprint() до понимания этого списка программа завершает работу с кодом 0, но результата нет и print()после понимания списка не работает. Что я делаю не так?

РЕДАКТИРОВАТЬ:

Полный код:

text = "Speed 30 ft. Melee short sword +3 (1d6+1/19-20) Ranged light crossbow +3 (1d8/19-20)  Special Attacks sneak attack +1d6 Spell-Like Abilities (CL 1st) "
if attacks:
    attacks = attacks.group().split(")")
    attacks = [match
               for attack in attacks
               if (match := re.search(r"(\([0-9]+d[\s\S]+\))", attack).group() is not None)]

1 ответ

Решение

Удалить .group() is not None. Если совпадений нет,re.search() возвращается None и возникает исключение:

import re


attacks = ['(7dW)', 'xxx']
attacks = [match
           for attack in attacks
           if (match := re.search(r"(\([0-9]+d[\s\S]+\))", attack))]

print(attacks)

Печать:

[<re.Match object; span=(0, 5), match='(7dW)'>]
Другие вопросы по тегам