Регулярное выражение для извлечения строки после даты в Python

#python #regex

Вопрос:

Наличие этих двух типов строк:

 1625212673449-2021_07_02_07_55_05_111040_0CM.csv.zip  1635508858063-1625212673449-2021_07_02_07_55_05_111040_0CM.csv.zip  

Как я могу получить с помощью регулярного 111040 выражения часть строки? В нем всегда 6 цифр.

Мой подход таков: «Возьмите 6-значный код после части YYYY_MM_DD_HH_MM_SS_», но любой другой подход также приветствуется.

ИЗМЕНИТЬ: Последнюю часть _0CM.csv.zip можно легко изменить.

Заранее спасибо.

Комментарии:

1. Разве вы не можете разделить подчеркивание и взять предпоследний элемент?

2. Вам нужно использовать регулярное выражение?

3. Разве 111040 не состоит из шести цифр?

4. Сейчас 6, да. Извините, я ошибся.

Ответ №1:

Вы хотели регулярное выражение, так что вот оно:

 [0-9]{4}(?:_[0-9]{2}){5}_([0-9]{6})  
  • [0-9]{4} : совпадите с первыми 4 цифрами года, это наш стартовый якорь
  • (?:_[0-9]{2}){5} : после этого следует 5 двузначных чисел (месяц, день, час, минута, секунда), поэтому мы можем просто сгруппировать их все и игнорировать
  • ([0-9]{6}) : получите 6 цифр, следующих за предыдущим выражением.

Желаемое число находится в группе захвата 1 этого регулярного выражения:

 import re regex = '[0-9]{4}(?:_[0-9]{2}){5}_([0-9]{6})' re.search(regex, '1625212673449-2021_07_02_07_55_05_111040_0CM.csv.zip').group(1)  

Комментарии:

1. Моя вина, что это 6-значная цифра. Изменение последнего {5} на {6} работает! Спасибо»

Ответ №2:

Как насчет этой модели? Работает, если вы сопоставляете каждую строку по очереди:

 import re pattern = re.compile('d{4}_d{2}_d{2}_d{2}_d{2}_d{2}_(d{6})') print(pattern.findall("1625212673449-2021_07_02_07_55_05_111040_0CM.csv.zip"))  

Ответ №3:

Это вернет», если соответствующее совпадение не найдено.

 import re  strings = [  "1625212673449-2021_07_02_07_55_05_111040_0CM.csv.zip",  "1635508858063-1625212673449-2021_07_02_07_55_05_111040_0CM.csv.zip",  'Test' ]  pattern = re.compile('_(d{6})_')  digits = [pattern.search(string).group(1) if pattern.search(string) else '' for string in strings]  print(digits)