Я изо всех сил пытался правильно отформатировать регулярное выражение, чтобы вытащить первую дату в следующем имени файла:
TEST_2022-03-04-05-30-20.csv_parsed.csv_encrypted.csv
Я выполнил следующее и ожидал, что извлеку первую дату в каждом имени файла, отформатированном как 2022-03-04
date = re.search('\b(\d{4}-\d{2}-\d{2}).', имя файла)
Я получил следующую ошибку в строке поиска: >AttributeError: объект «NoneType» не имеет атрибута «группа».
Ответ ниже полезен и решил проблему. Это ценный ресурс для изучения того, как использовать поиск по регулярным выражениям.
Эта ошибка означает, что регулярное выражение не соответствует. Вам нужно проверить возвращаемое значение, прежде чем пытаться получить группу.
Я считаю, что группа (0) возвращает полную строку, совпавшую с регулярным выражением
В этом каталоге должны быть файлы, в именах которых нет дат.
Спасибо, Бармар, это моя задача, я новичок в регулярных выражениях и не могу понять, как правильно искать имена файлов, основываясь на моей цели выше. Поскольку он ничего не находит, кажется, я неправильно ищу имена файлов с кодом, следующим за re.search
Все файлы в каталоге соответствуют формату в приведенном выше примере и имеют даты.
Вам нужно проверить, совпало ли регулярное выражение, прежде чем углубиться и попытаться извлечь совпадающий текст.
for filename in filenames:
match = re.search(r'\b(\d{4}-\d{2}-\d{2})\.', filename)
if not match:
continue
date = match.group(1)
...
Обратите также внимание на использование необработанной строки r'...'
и использование group(1)
только для извлечения совпадения из выражения в скобках.
Есть несколько проблем с вашим регулярным выражением.
Во-первых, само регулярное выражение неверно:
\b # Match a word boundary (non-word character followed by word character or vice versa)
( # followed by a group which consists of
\d{4}- # 4 digits and '-', then
\d{2}- # 2 digits and '-', then
\d{2} # another 2 digits
) # and eventually succeeded by
\. # a dot
Поскольку у вашего filename
(TEST_2022-03-04-05-30-20.csv_parsed.csv_encrypted.csv
) нет такой группы, re.search()
терпит неудачу и возвращает None
. Вот почему:
2022-03-04
не следует после точки\b
не соответствует, так как и _
, и 2
считаются символом слова.При этом регулярное выражение следует изменить, например:
(?<=_) # Match something preceded by '_', which will not be included in our match,
\d{4}- # 4 digits and '-', then
\d{2}- # 2 digits and '-', then
\d{2} # another 2 digits, then
\b # a word boundary
Теперь вы видите эти обратные косые черты? Всегда помните, что вам нужно снова экранировать их в строках. Это можно автоматизировать с помощью необработанных строк:
r'(?<=_)\d{4}-\d{2}-\d{2}\b'
Попробуй это:
filename = 'TEST_2022-03-04-05-30-20.csv_parsed.csv_encrypted.csv'
match = re.search(r'(?<=_)\d{4}-\d{2}-\d{2}\b', filename).group(0)
print(match) # '2022-03-04'
Это решило мою проблему с исследованиями, спасибо за разъяснения.
в чем смысл
group(0)
?