从列表中删除指定字符串 - Python

3
foo = '/input/directory/'
faa = ['/input/directory/file1.txt', '/input/directory/file2.txt']

我需要从我的列表(faa)中移除目录名(即foo),并且去掉文件扩展名,只留下文件名。
bar = ['file1', 'file2']
7个回答

4
使用 map 函数。
bar = map(lambda x: '.'.join(x.replace(foo, '').split('.')[:-1]), faa)

1
这有点不正确——如果文件名中包含一个点呢?因此,第一个lambda应该被修改。编辑:使用新的缩短代码——split()的切片不应该只是[0] :) ... 编辑2:你可能应该使用rsplit(___, 1)[0]。 - plamut
@plamut 同意,现在已经修复。 - hjpotter92

1
尝试;
>>> [x.replace(foo, '').split('.')[0] for x in faa]
['file1', 'file2']

1
也许:
bar = [elem.replace(foo, '').rsplit('.', 1)[0] for elem in faa]

1
foo = '/input/directory/'
faa = ['/input/directory/file1.txt', '/input/directory/file2.txt']

import os.path

bar = [os.path.splitext(path.replace(foo, ''))[0]
       for path in faa]
print(bar)

或者没有foo:

faa = ['/input/directory/file1.txt', '/input/directory/file2.txt']

from os.path import basename, splitext
bar = [splitext(basename(path))[0]
       for path in faa]
print(bar)

0
你可以这样做:
import os

foo = '/input/directory/'
faa = ['/input/directory/file1.txt', '/input/directory/file2.txt', '/not/matching/foo/file3.txt']   

faa = [os.path.splitext(os.path.split(f)[1])[0] if f.startswith(foo) else f for f in faa]   
print faa

这将会给你以下列表:
['file1', 'file2', '/not/matching/foo/file3.txt']

如果您一直需要文件名,则可以这样做:

import os

foo = '/input/directory/'
faa = ['/input/directory/file1.txt', '/input/directory/file2.txt', '/not/matching/foo/file3.txt']   

faa = [os.path.splitext(os.path.split(f)[1])[0] for f in faa]   
print faa

给定:

['file1', 'file2', 'file3']

0
您可以进行以下操作:
import re
foo = '/input/directory/'
faa = ['/input/directory/file1.txt', '/input/directory/file2.txt']

# Use a regular expression to match '<foo>someFileName<.fileExtension>'
faa = [re.sub(r'^%s(.*)\.\w+$' % foo, '\g<1>', elem) for elem in faa]

# faa => ['file1', 'file2']

1
foo = '/input/directory' <- 字符串应该用引号括起来 - hjpotter92
啊是的,你说得对(我从 OP 的问题中复制粘贴过来的)。 - Nander Speerstra

0
你可以使用 re 模块和 re.findall 来实现这个功能,其中正向后查找 (?<=) 用于匹配你的 foo 字符串,正向前查找 extension 并锚定到字符串的末尾:
res = [re.findall('(?<={}).+(?=[.].*$)'.format(foo), elem)[0] for elem in faa]

print(res)
['file1', 'file2']

注意:您可以使用regex101.com检查该regex表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接