python - 如何使用 python 删除文件基名的扩展名

标签 python regex

我在这样的列表中得到了文件的完整路径:

a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']

我想要的是只获取不带扩展名的文件 NAMES,例如:

b = ['datafile', 'datafile2', 'datafile3']

我试过的是:

xfn = re.compile(r'(\.xls)+')
for name in a:
    fp, fb = os.path.split(fp)
    ofn = xfn.sub('', name)
    b.append(ofn)

但结果是:

b = ['datafilex', 'datafile2', 'datafile3x']

最佳答案

  1. 您使用的正则表达式是错误的。 (\.xls)+匹配 .xls 形式的字符串, .xls.xls等。这就是为什么还有一个 x.xlsx项目。你要的是\.xls.* ,即 .xls后跟零个或多个任意字符。

  2. 您实际上并不需要使用正则表达式。 os.path中有专门的方法处理这个:basenamesplitext .

    >>> import os.path
    >>> os.path.basename('home/robert/Documents/Workspace/datafile.xlsx')
    'datafile.xlsx'
    >>> os.path.splitext(os.path.basename('home/robert/Documents/Workspace/datafile.xlsx'))[0]
    'datafile'
    

    因此,假设您并不真正关心 .xls/.xlsx后缀,您的代码可以像这样简单:

    >>> a = ['home/robert/Documents/Workspace/datafile.xlsx', 'home/robert/Documents/Workspace/datafile2.xls', 'home/robert/Documents/Workspace/datafile3.xlsx']
    >>> [os.path.splitext(os.path.basename(fn))[0] for fn in a]
    ['datafile', 'datafile2', 'datafile3']
    

    (还要注意 list comprehension 。)

关于python - 如何使用 python 删除文件基名的扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15849521/

相关文章:

Python:从树状数据结构中的列表列表创建组合

python - 如何缩短这个二维数组代码?

c++ - 静态编译会破坏ABI吗?

java - 在标记内转换括号和嵌套括号的正则表达式

python - 如何将列表列表转换为数据框并将列表的第一个元素作为索引

python - 在 HttpResponse() 调用后,Django View 没有得到完全处理

python - 需要 Django-easy-pdf : xhtml2pdf reporting reportlab 2. 2+,但已安装 3.0

python - 如何使用正则表达式将特定的子字符串提取到新行中?

java - 使用java无需标记即可查找和替换

regex - 匹配单个页面或页面范围的正则表达式?