Python: выведите 4 символа после определенных символов в строке

#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)