Я пытаюсь извлечь дату и время поиска, используя произвольные форматы файлов. Некоторые из этих шаблонов включают в себя повторяющиеся элементы формата даты, такие как %Y%M%d
.
datetime.datetime.strptime
, как правило, очень удобны для этого, но их реализация в регулярном выражении исключает использование повторяющихся элементов формата даты.
Например, при выполнении этого кода:
import datetime
filepath = '/backups/20190905/data-20190905-230001.tgz'
filepattern = '/backups/%Y%m%d/data-%Y%m%d-%H%M%S.tgz'
backup_time_stamp = datetime.datetime.strptime(filepath, filepattern)
выдает следующую ошибку:
Traceback (most recent call last):
File "strp.py", line 11, in <module>
backup_time_stamp = datetime.datetime.strptime(filepath, filepattern)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 565, in _strptime_datetime
tt, fraction = _strptime(data_string, format)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 345, in _strptime
format_regex = _TimeRE_cache.compile(format)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_strptime.py", line 275, in compile
return re_compile(self.pattern(format), IGNORECASE)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py", line 233, in compile
return _compile(pattern, flags)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py", line 301, in _compile
p = sre_compile.compile(pattern, flags)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_compile.py", line 562, in compile
p = sre_parse.parse(p, flags)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py", line 856, in parse
p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, False)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py", line 415, in _parse_sub
itemsappend(_parse(source, state, verbose))
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py", line 757, in _parse
raise source.error(err.msg, len(name) + 1) from None
sre_constants.error: redefinition of group name 'Y' as group 4; was group 1 at position 101
Это задокументированное ограничение datetime.datetime.strptime
. Мне интересно, каким будет возможный обходной путь.