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