在下划线上拆分文件名python

时间:2018-01-30 15:24:26

标签: python string split

我的文件名为" Planning_Group_20180108.ind "。我只想要Planning_Group。文件名也可以像 Soldto_20180108 ,这种情况下输出应仅为 Soldto

不使用reg ex的解决方案更为可取,因为对于尚未使用正则表达式的人来说,它更容易阅读

5 个答案:

答案 0 :(得分:5)

以下内容适用于您

s="Planning_Group_20180108.ind"
'_'.join(s.split('_')[:-1])

这样您就可以创建一个列表,该列表是_处分割的字符串。使用[:-1]删除最后一部分。 '_'.join()将结果列表中的列表元素组合在一起。

答案 1 :(得分:2)

print("Planning_Group_20180108.ind".rsplit("_", 1)[0])
print("Soldto_20180108".rsplit("_", 1)[0])

rsplit允许您在检测到“_”时从结尾分割X次。在你的情况下,它将它分成两个字符串[“Planning_Group”,“20180108.ind”]的数组,你只需要取第一个元素[0](http://python-reference.readthedocs.io/en/latest/docs/str/rsplit.html

答案 2 :(得分:1)

您可以使用re

import re
s = ["Planning_Group_20180108.ind", 'Soldto_20180108']
new_s = list(map(lambda x:re.findall('[a-zA-Z_]+(?=_\d)', x)[0], s))

输出:

['Planning_Group', 'Soldto']

答案 3 :(得分:1)

在这里使用正则表达式非常pythonic。

import re
newname = re.sub(r'_[0-9]+', '', 'Planning_Group_20180108.ind"')

结果:

'Planning_Group.ind'

相同的正则表达式从'SoldTo'生成'Soldto_20180108'

答案 4 :(得分:1)

首先我会提取文件名本身。我将它从扩展名中分离出来。 你可以轻松地做到:

path = "Planning_Group_20180108.ind"
filename, ext = path.split(".")

假设路径实际上只是文件名和扩展名。如果我想保持安全和平台无关,我会使用os模块:

fullpath = "this/could/be/a/full/path/Planning_Group_20180108.ind"
path, filename = os.path.split(fullpath)

然后提取“root”和扩展名:

root, ext = os.path.splitext(filename)

这应该让 Planning_Group_20180108 作为 root 。 要丢弃“_ 20180108”,我们需要从右端分割字符串“_”分隔符,并且只执行一次。我会使用string的 .rsplit()方法,它允许我指定分隔符,以及我想要分割的次数。

what_i_want, the_rest = root.rsplit("_", 1)

what_i_want 应该包含 Planning_Group_20180108 的左侧,而不是从右侧开始计算第一个“_”,因此它应该是 Planning_Group < / p>

编写相同但不那么容易阅读的更紧凑的方式是:

what_i_want = os.path.splitext(os.path.split("/my/path/to/Planning_Group_20180108.ind")[1])[0].rsplit("_", 1)

PS。 如果您确定,您可以跳过具有提取根和扩展名的部分,该扩展名不包含下划线。如果你不确定,那么这一步是必要的。此外,您需要考虑具有多个扩展的大小写,例如 /path/to/file/which_has_a.lot.of.periods.and_extentions 。在这种情况下,你想获得 which_has_a.lot.of.periods.and ,或 which_has ? 在规划您的应用时考虑一下。如果你需要后者,你可能想要通过 filename.split(“。”,1)而不是使用 os.path.splitext()

参考:

os.path.split(path)

os.path.splitext(path)

str.rsplit(sep=None, maxsplit=-1)