[英]Split a filename python on underscore
我的文件名為“ Planning_Group_20180108.ind ”。 我只想要Planning_Group。 文件名也可以類似於Soldto_20180108 ,在這種情況下,輸出應僅是Soldto 。
不使用regex的解決方案是更可取的,因為對於尚未使用regex的人來說更容易閱讀
以下應該為您工作
s="Planning_Group_20180108.ind"
'_'.join(s.split('_')[:-1])
這樣,您將創建一個列表,該列表是在_
處分割的字符串。 用[:-1]
刪除最后一部分。 '_'.join()
將您的列表元素合並到結果列表中。
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/ zh / latest / docs / str / rsplit.html )
您可以使用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']
在這里使用正則表達式是相當pythonic的。
import re
newname = re.sub(r'_[0-9]+', '', 'Planning_Group_20180108.ind"')
結果是:
'Planning_Group.ind'
而同樣的正則表達式產生'SoldTo'
從'Soldto_20180108'
。
首先,我將提取文件名本身。 我將其與擴展名分開。 您可以通過以下簡單方法:
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”,我們需要從右端開始用“ _”定界符分割字符串,並且只執行一次。 我將使用.rsplit()字符串方法,該方法可讓我指定定界符以及要進行分割的次數。
what_i_want, the_rest = root.rsplit("_", 1)
what_i_want應該包含Planning_Group_20180108的左側剪切位置,而不是從右側開始計數的第一個“ _”,因此應為Planning_Group
編寫相同但不那么容易閱讀的更緊湊的方法是:
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()來提取根。
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.