RegExp. Как не включать пустой результат из вариантов поиска?

Задача: из строки вида "В 1946 году $100 $150 542 человека $200 $120 100$ 100 лошадей 500$ 140$" извлечь только числа с долларами, а именно должно получиться 100 150 200 12 100 500 140. Я решил извлечь эти данные с помощью следующей регулярки:

import re
str = 'В 1946 году $100 $150 542 человека $200 $120 100$ 100 лошадей 500$ 140$'
print(re.findall(str, r'(?:\$(\d+)|(\d+)\$)'))
[('100', ''), ('150', ''), ('200', ''), ('120', ''), ('', '100'), ('', '500'), ('', '140')]

а хотелось бы сразу, хотя бы
[('100'), ('150'), ('200'), ('120'), ('100'), ('500'), ('140')]


Как можно этого добиться в самом регулярном выражении, без последующей обработки списка с удалением пустых значений?
  • Вопрос задан
  • 830 просмотров
Решения вопроса 2
mututunus
@mututunus
Backend developer (Python, Golang)
[r.strip('$') for r in re.findall(r'(\$\d+|\d+\$)', str)]

либо
[r[0] or r[1] for r in re.findall(r'(?:\$(\d+)|(\d+)\$)', str)]
Ответ написан
@Dorothy Автор вопроса
re.findall(r'(?<=\$)\d+|\d+(?=\$)', str)

# ['100', '150', '200', '120', '100', '500', '140']
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@deliro
Зачем регулярки-то?
[word.strip('$') for word in st.split() if '$' in word]
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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