关于正则表达式:使用python中的模式匹配获取文件扩展名

Getting file extension using pattern matching in python

我试图找到一个文件的扩展名,给它的名字作为字符串。 我知道我可以使用函数os.path.splitext,但是如果我的文件扩展名为.tar.gz.tar.bz2,则它不能正常工作,因为它将扩展名设为gzbz2而不是tar.gz和< 分别为x6>。
所以我决定使用模式匹配自己找到文件的扩展名。

1
2
3
4
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...),因为我也想获得扩展名。

请帮忙。


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

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


1
2
3
4
5
>>> 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匹配的最小匹配。


从phihags回答:

1
2
3
4
5
6
7
8
9
10
11
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

我有一个想法比用正则表达式打破头脑容易得多,有时它也可能听起来很愚蠢。

name="filename.tar.gz"
extensions=('.tar.gz','.py')
[x for x in extensions if name.endswith(x)]


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

1
2
3
4
5
6
7
8
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'


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

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