Получение расширения файла с использованием сопоставления с образцом в python

Я пытаюсь найти расширение файла, учитывая его имя как строку. Я знаю, что могу использовать функцию os.path.splitext, но она не работает так, как ожидалось, в случае, если расширение моего файла равно .tar.gz или .tar.bz2, поскольку оно дает расширения как gz и bz2 вместо tar.gz и tar.bz2 соответственно.
Поэтому я решил найти расширение файлов самостоятельно, используя сопоставление с образцом.

print re.compile(r'^.*[.](?P<ext>tar\.gz|tar\.bz2|\w+)$').match('a.tar.gz')group('ext')
>>> gz            # I want this to come as 'tar.gz'
print re.compile(r'^.*[.](?P<ext>tar\.gz|tar\.bz2|\w+)$').match('a.tar.bz2')group('ext')
>>> bz2           # I want this to come 'tar.bz2'

Я использую (?P<ext>...) в моем сопоставлении с образцом, так как я также хочу получить расширение.

Пожалуйста, помогите.

Ответ 1

>>> print re.compile(r'^.*[.](?P<ext>tar\.gz|tar\.bz2|\w+)$').match('a.tar.gz').group('ext')
gz
>>> print re.compile(r'^.*?[.](?P<ext>tar\.gz|tar\.bz2|\w+)$').match('a.tar.gz').group('ext')
tar.gz
>>>

Что? оператор пытается найти минимальное совпадение, поэтому вместо. * есть ".tar" также. *? находит минимальное совпадение, которое позволяет сопоставлять .tar.gz.

Ответ 2

root,ext = os.path.splitext('a.tar.gz')
if ext in ['.gz', '.bz2']:
   ext = os.path.splitext(root)[1] + ext

<суб > Некоторые люди, столкнувшись с проблемой, думают: "Я знаю, я буду использовать регулярные выражения". Теперь у них есть две проблемы. Суб >

Ответ 3

У меня есть идея, которая намного проще, чем разбивать голову регулярным выражением, иногда это может показаться глупым.
name="filename.tar.gz"
extensions=('.tar.gz','.py')
[x for x in extensions if name.endswith(x)]

Ответ 4

Начиная с ответа phihags:

DOUBLE_EXTENSIONS = ['tar.gz','tar.bz2'] # Add extra extensions where desired.

def guess_extension(filename):
    """
    Guess the extension of given filename.
    """
    root,ext = os.path.splitext(filename)
    if any([filename.endswith(x) for x in DOUBLE_EXTENSIONS]):
        root, first_ext = os.path.splitext(root)
        ext = first_ext + ext
    return root, ext

Ответ 5

Продолжая от phihags отвечать на общий, удалите все двойные или тройные расширения, такие как CropQDS275.jpg.aux.xml, используя while. в:

tempfilename, file_extension = os.path.splitext(filename)
while '.' in tempfilename:
     tempfilename, tempfile_extension = os.path.splitext(tempfilename)
     file_extension = tempfile_extension + file_extension

Ответ 6

это просто и работает как с одним, так и с несколькими расширениями

In [1]: '/folder/folder/folder/filename.tar.gz'.split('/')[-1].split('.')[0]
Out[1]: 'filename'

In [2]: '/folder/folder/folder/filename.tar'.split('/')[-1].split('.')[0]
Out[2]: 'filename'

In [3]: 'filename.tar.gz'.split('/')[-1].split('.')[0]
Out[3]: 'filename'