Python 在下划线上拆分文件名

Python 在下划线上拆分文件名,python,string,split,Python,String,Split,我有一个文件名为“规划组\u 20180108.ind”。我只想让你的团队退出。文件名也可以类似于Soldto_20180108,在这种情况下,输出应仅为Soldto 不使用regex的解决方案更可取,因为对于尚未使用regex的人来说,它更容易阅读 s="Planning_Group_20180108.ind" '_'.join(s.split('_')[:-1]) 通过这种方式,您可以创建一个列表,该列表是在处拆分的字符串。使用[:-1]删除最后一部分“'.join()将列表元素组合到结果

我有一个文件名为“规划组\u 20180108.ind”。我只想让你的团队退出。文件名也可以类似于Soldto_20180108,在这种情况下,输出应仅为Soldto


不使用regex的解决方案更可取,因为对于尚未使用regex的人来说,它更容易阅读

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

通过这种方式,您可以创建一个列表,该列表是在
处拆分的字符串。使用
[:-1]
删除最后一部分
“'.join()
将列表元素组合到结果列表中。

您可以使用
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']

rsplit允许您在检测到“\u1”时从末尾拆分X次。在您的例子中,它将把它拆分为两个字符串的数组[“Planning_Group”,“20180108.ind”],您只需要使用正则表达式获取第一个元素[0]()

,这是一种非常类似python的用法

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

'Planning_Group.ind'

同一个正则表达式从
'SoldTo_20180108'
生成
'SoldTo'
,首先我要提取文件名本身。我会把它和分机分开。 您可以通过以下方式轻松完成:

path = "Planning_Group_20180108.ind"
filename, ext = path.split(".")
它假设路径实际上只是一个文件名和扩展名。如果我想保持安全和平台独立,我会使用操作系统模块:

fullpath = "this/could/be/a/full/path/Planning_Group_20180108.ind"
path, filename = os.path.split(fullpath)
然后提取“根”和扩展名:

root, ext = os.path.splitext(filename)
这应该让我把规划组20180108作为根。 要丢弃“_20180108”,我们需要用“_”分隔符分隔字符串,从右端开始,并且只执行一次。我将使用字符串的.rsplit()方法,该方法允许我指定分隔符和要进行拆分的次数

what_i_want, the_rest = root.rsplit("_", 1)
我想要什么应该包含计划组\U 20180108的左侧切掉,而不是从右侧开始的第一个“\uU”计数,因此它应该是计划组

写同样内容但不那么容易阅读的更简洁的方法是:

what_i_want = os.path.splitext(os.path.split("/my/path/to/Planning_Group_20180108.ind")[1])[0].rsplit("_", 1)
附言。 如果确定扩展名不包含下划线,则可以跳过提取根和扩展名的部分。如果您对此不确定,则需要执行此步骤。此外,您还需要考虑具有多个扩展名的case,例如/path/to/file/,它有大量的.periods.和扩展名。在这种情况下,您想得到哪个有很多句点和,还是哪个有? 在规划你的应用程序时考虑一下。如果需要后者,您可能希望通过执行filename.split(“.”,1)而不是使用os.path.splitext()

参考:

,


查看拆分功能
规划组\u 20180108.ind“。拆分(“”“)
我尝试过拆分,但无法获得完整的解决方案。不知道为什么每个人都投反对票你的问题不清楚。您似乎不想在任何下划线上拆分,只想在最后一个下划线上拆分,对吗?是否总是至少有一个下划线?如果没有,结果应该是什么?
filename.rsplit(''u',1)[0]
what_i_want = os.path.splitext(os.path.split("/my/path/to/Planning_Group_20180108.ind")[1])[0].rsplit("_", 1)