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

Pus*_*ade 5 python regex

我试图找到一个文件的扩展名,给它的名字作为字符串.我知道我可以使用的功能os.path.splitext,但它并不按预期的情况下,我的文件扩展名是.tar.gz.tar.bz2因为它提供了扩展的gzbz2,而不是tar.gztar.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'
Run Code Online (Sandbox Code Playgroud)

我正在使用(?P<ext>...)我的模式匹配,因为我也希望得到扩展名.

请帮忙.

phi*_*hag 15

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

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

  • @Guanidene更紧凑不等于更易读和可维护.另外,为什么复杂的正则表达式比三行甚至非程序员都能理解的那样笨拙?无论如何,每个人都有自己的. (11认同)
  • @Guanidene:如果是家庭作业,请标记问题作业.如果它不是作业,当函数已经被编写,调试并且有效时,不要使用正则表达式. (4认同)

Omr*_*rel 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
>>>
Run Code Online (Sandbox Code Playgroud)

?运算符试图找到最小匹配项,所以也不要使用。*来代替“ * .tar”。查找允许.tar.gz匹配的最小匹配。