[英]How to extract specific string from filename?
如何僅使用“一行”代碼從文件名中提取特定字符串? 我可以分兩行完成(如果我們只考慮帶有 extracted 和 extracted2 的行)但不知道是否可以在一行中完成?
我想從文件名 text__text_numberandtext_text_text_this.xlsx 中提取“ this ”
這是我目前擁有的“2 行”代碼:
s = "text__text_numberandtext_text_text_this.xlsx"
extracted = '_'.join(s.split('_')[6:7])
extracted2 = '.'.join(extracted.split('.')[:1])
print(extracted2)
您可以使用正則表達式並執行以下操作:
>>> s
'text__text_numberandtext_text_text_this.xlsx'
>>> re.search('.*_(\w+)\.xlsx', s).group(1)
'this'
在上面的正則表達式中,我們捕獲了“_”之后和“.xlsx”擴展名之前的最后一個單詞字符。
不要尋找“一行”代碼。 想想最干凈的解決方案。
spam = "text__text_numberandtext_text_text_this.xlsx"
eggs = spam.split('_')[-1].split('.')[0]
print(eggs)
output
this
編輯:對 3 個備選方案進行基准測試很有趣。
from timeit import timeit
print(timeit("s.split('_')[-1].split('.')[0]", setup="s='text__text_numberandtext_text_text_this.xlsx'"))
print(timeit("re.search('.*_(\w+)\.xlsx', s).group(1)", setup="import re; s='text__text_numberandtext_text_text_this.xlsx'"))
print(timeit("s[s.rfind('_')+1:s.rfind('.')]", setup="s='text__text_numberandtext_text_text_this.xlsx'"))
output:
0.8729359760000079
2.0453107610010193
0.6893644140000106
s[s.rfind('_')+1:s.rfind('.')]
output:
'this'
這不是您的代碼的作用,但如果我理解正確的話,這就是您的描述所要求的。 只有當您知道要查找的文本緊接在最后一個下划線和最后一個句點之間時,這才有效。
只是為了添加另一個觀點:因為最后你要處理一個路徑(或文件名),一個好主意是使用pathlib
。 使用stem
屬性,您可以輕松獲得沒有擴展名的名稱,然后只需要使用rsplit
獲取最后的_
部分:
from pathlib import Path
s = Path("text__text_numberandtext_text_text_this.xlsx")
print(s.stem.rsplit('_', 1)[-1])
關於rsplit
的簡短解釋:
split
相同,只有當你給它一個maxsplit
參數時,它才會從右端分裂。maxsplit=1
。rsplit
返回一個列表,在本例中只有 2 個元素。 然后我們用[-1]
取最后一個元素。 一個更有效的版本是使用rpartition
而不是rsplit
:
s.stem.rpartition('_')[-1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.