在python中使用模式匹配获取文件扩展名

时间:2011-06-29 18:16:51

标签: python regex

我正在尝试查找文件的扩展名,并将其名称作为字符串。我知道我可以使用函数os.path.splitext,但如果我的文件扩展名为.tar.gz.tar.bz2,则它不会按预期工作,因为它将扩展名设为gz和{{ 1}}分别代替bz2tar.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' ,因为我也想获得扩展名。

请帮忙。

6 个答案:

答案 0 :(得分:14)

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

<子> 有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

答案 1 :(得分:4)

>>> 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 :(得分:2)

我有一个想法比用正则表达式打破头脑容易得多,有时它听起来也很愚蠢。
name="filename.tar.gz"
extensions=('.tar.gz','.py')
[x for x in extensions if name.endswith(x)]

答案 3 :(得分:2)

从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

答案 4 :(得分:1)

这很简单,适用于单个和多个扩展

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'

答案 5 :(得分:0)

继续从phihags回答泛型删除所有双重或三重扩展,例如CropQDS275.jpg.aux.xml使用'。'在:

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