我有以下字符串:
/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
不允许定义什么应该被视为扩展。事实上,perl 函数的名称 basename
是一个错误的命名,因为在 *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
指定为 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'
关于python - 在Python中获取具有预先指定扩展名的文件基名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22473573/