#python #regex
Вопрос:
Мне нужно из этой строки:
CR: 0.24% RU 01.07.2021 CR: 0.44% TJ 01.07.2021 CR: 0.15% TJ 01.07.2021 CR: 0.18% TJ 01.07.2021
Получите массив, подобный этому:
['0.24%', '0.44%', '0.15%', '0.18%']
То есть, получите 4 символа после CR:
Я попытался разобраться в этом с помощью регулярных выражений и смог получить один символ после CR:
моего кода:
print(re.findall(r'CR: (w )', string))
Заранее спасибо за вашу помощь!
Комментарии:
1. Попробуйте
w{4}
вместоw
этого ?2. Возвращает мне пустой массив в этом случае
Ответ №1:
Проблема заключается в w
шаблоне, который соответствует одной или нескольким буквам, цифрам и знакам подчеркивания (с некоторыми знаками препинания и диакритическими знаками). Это не соответствует .
и %
символам.
Вы можете использовать
import re
s = "CR: 0.24% RU 01.07.2021 CR: 0.44% TJ 01.07.2021 CR: 0.15% TJ 01.07.2021 CR: 0.18% TJ 01.07.2021"
print(re.findall(r'CR:s*(d (?:.d )?%)', s))
# => ['0.24%', '0.44%', '0.15%', '0.18%']
Смотрите демонстрацию регулярных выражений и демонстрацию Python.
Вы также можете просто написать слово после CR:
с пробелами:
print(re.findall(r'CR:s*(S )', s))
Смотрите демонстрацию регулярных выражений.
Подробные сведения:
CR:
—CR:
строка (добавьтеb
спереди, если хотите убедиться, что до этого не было других букв/цифрCR
)s*
— ноль или более символов пробелов(d (?:.d )?%)
— Захват группы 1: одна или несколько цифр, а затем необязательное вхождение точки и одной или нескольких цифр, а затем%
символ(S )
— один или несколько символов без пробелов.
Ответ №2:
Проблема
'0.24%'
это 5, а не 4 символаw
это для[a-zA-Z0-9_]
того, чтобы он не учитывал точку
Решения
.{5}
для любых 5 символовre.findall(r'CR: (.{5})', string) # ['0.24%', '0.44%', '0.15%', '0.18%']
(S )
для любого количества непустых символовre.findall(r'CR: (S )', string) # ['0.24%', '0.44%', '0.15%', '0.18%']
(d .d %)
для точного соответствия ожидаемому содержимому используйте плавающее число с%
символомre.findall(r'CR: (d .d %)', string)