我有以下字符串:
/path1/path2/foo.bar.qux.txt
我想要做的是通过指定扩展名提取基本名称。如果我将扩展名定义为,.bar.qux.txt
则基本名称为“ foo
”。然后,如果扩展名为,.qux.txt
则基数为:foo.bar
。
Perl具有以下功能:
use File::Basename;
my $longones = "/path1/path2/foo.bar.qux.txt";
my $base = basename($longones,"*.bar.qux.txt");
print "$base\n";
Python的实现方式是什么?
没有内置功能可以满足您的需求。os.path.splitext
不允许定义应视为扩展的内容。实际上,basename
perl函数的名称是一个错误的名称,因为* NIX中basename
确实包含扩展名。
但是,您可以结合os.path.basename
使用rsplit
:
>>> import os
>>> os.path.basename('/path1/path2/foo.bar.qux.txt').rsplit('.bar.qux.txt')[0]
'foo'
>>> os.path.basename('/path1/path2/foo.bar.qux.txt').rsplit('.qux.txt')[0]
'foo.bar'
请注意,如果文件名包含扩展名,则可能会得到错误的结果:
>>> os.path.basename('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt').rsplit('.qux.txt')[0]
'foo.bar'
但是,您始终可以指定一个maxsplit
of 1
,仅拆分第一个扩展名:
>>> os.path.basename('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt').rsplit('.qux.txt', maxsplit=1)[0]
'foo.bar.qux.txt.foo.bar'
在python2中,您必须将第二个参数指定为rsplit(text, 1)
。
或者使用rpartition
:
>>> os.path.basename('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt').rpartition('.qux.txt')[0]
'foo.bar.qux.txt.foo.bar'
使用正则表达式的解决方案可能是:
import re
def basename_without_ext(path, ext):
regex = re.compile('{}$'.format(re.escape(ext)))
return regex.sub('', os.path.basename(path))
用作:
>>> basename_without_ext('/path1/path2/foo.bar.qux.txt.foo.bar.qux.txt', '.qux.txt')
'foo.bar.qux.txt.foo.bar'
>>> basename_without_ext('/path1/path2/foo.bar.qux.txt', '.bar.qux.txt')
'foo'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句