Getting file extension using pattern matching in python
我试图找到一个文件的扩展名,给它的名字作为字符串。 我知道我可以使用函数
所以我决定使用模式匹配自己找到文件的扩展名。
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' |
我在模式匹配中使用
请帮忙。
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 |
我有一个想法比用正则表达式打破头脑容易得多,有时它也可能听起来很愚蠢。
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 |