Оператор 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)'>]