我的文件名为" Planning_Group_20180108.ind "。我只想要Planning_Group。文件名也可以像 Soldto_20180108 ,这种情况下输出应仅为 Soldto 。
不使用reg ex的解决方案更为可取,因为对于尚未使用正则表达式的人来说,它更容易阅读
答案 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()
参考: