[英]how to remove string ending with specific string
我有像這樣的文件名
ios_g1_v1_yyyymmdd
ios_g1_v1_h1_yyyymmddhhmmss
ios_g1_v1_h1_YYYYMMDDHHMMSS
ios_g1_v1_g1_YYYY
ios_g1_v1_j1_YYYYmmdd
ios_g1_v1
ios_g1_v1_t1_h1
ios_g1_v1_ty1_f1
我只想刪除與字符串 YYYYMMDDHHMMSS OR yyyymmdd OR YYYYmmdd OR YYYY 匹配的后綴
我預期的 output 將是
ios_g1_v1
ios_g1_v1_h1
ios_g1_v1_h1
ios_g1_v1_g1
ios_g1_v1_j1
ios_g1_v1
ios_g1_v1_t1_h1
ios_g1_v1_ty1_f1
如何使用正則表達式在 python 中實現此目的? 我嘗試了類似下面的方法,但沒有用
word_trimmed_stage1 = re.sub('.*[^YYYYMMDDHHMMSS]$', '', filename)
IIUC,您的模式涉及Year, Month, Day, Hour, Minute, Second
字符,並按該順序包含任意數量的重復字符,以下划線開頭且不區分大小寫。
試試這個模式r"_Y+M*D*H*M*S*"
-
import re
regex_pattern = r"_Y+M*D*H*M*S*"
result = [re.sub(regex_pattern,'',i, flags=re.IGNORECASE) for i in l]
result
['ios_g1_v1',
'ios_g1_v1_h1',
'ios_g1_v1_h1',
'ios_g1_v1_g1',
'ios_g1_v1_j1',
'ios_g1_v1',
'ios_g1_v1_t1_h1',
'ios_g1_v1_ty1_f1']
_
匹配模式開頭的下划線flags=re.IGNORECASE
使此模式搜索不區分大小寫Y+
至少匹配Y
的 1 個實例M*D*H*M*S*
按順序匹配初始Y
之后這些特定字符的任何實例(從 0 個實例開始)您可以明確並使用您已確定的確切模式,可以選擇不區分大小寫與re.I
:
files = ['ios_g1_v1_yyyymmdd',
'ios_g1_v1_h1_yyyymmddhhmmss',
'ios_g1_v1_h1_YYYYMMDDHHMMSS',
'ios_g1_v1_g1_YYYY',
'ios_g1_v1_j1_YYYYmmdd',
'ios_g1_v1',
'ios_g1_v1_t1_h1',
'ios_g1_v1_ty1_f1']
files2 = [re.sub('_(?:YYYYMMDDHHMMSS|yyyymmdd|YYYYmmdd|YYYY)$', '', x, flags=re.I)
for x in files]
注意。 使用re.I
你只需要yyyymmdd
/ YYYYmmdd
。
壓縮變體:
files2 = [re.sub('_YYYY(?:MMDD(?:HHMMSS)?)?$', '', x, flags=re.I) for x in files]
Output:
['ios_g1_v1',
'ios_g1_v1_h1',
'ios_g1_v1_h1',
'ios_g1_v1_g1',
'ios_g1_v1_j1',
'ios_g1_v1',
'ios_g1_v1_t1_h1',
'ios_g1_v1_ty1_f1']
要刪除以“YYYYMMDDHHMMSS”或其他指定格式之一結尾的字符串,可以使用 rstrip 方法。 此方法將刪除指定字符串中出現在目標字符串末尾的所有字符。
以下是如何使用它的示例:s = "abcdefgYYYYMMDDHHMMSS" suffix = "YYYYMMDDHHMMSS"
您還可以通過將“YYYYMMDDHHMMSS”替換為適當的格式字符串來刪除其他指定格式。
免責聲明:這是一種非正則表達式方法; @mozway 發布了一個很好的正則表達式方法
files = ['ios_g1_v1_yyyymmdd',
'ios_g1_v1_h1_yyyymmddhhmmss',
'ios_g1_v1_h1_YYYYMMDDHHMMSS',
'ios_g1_v1_g1_YYYY',
'ios_g1_v1_j1_YYYYmmdd',
'ios_g1_v1',
'ios_g1_v1_t1_h1',
'ios_g1_v1_ty1_f1']
lst=[]
for filenames in files:
k=[]
for x in range(len(filenames)-1):
if filenames[x]=='y' or filenames[x]=='Y':
if filenames[x+1]=='y' or filenames[x+1]=='Y':
break
else:
k.append(filenames[x])
if k[-1]=='_':
lst.append(''.join(k)[:-1])
else:
lst.append(''.join(k))
print(lst)
#['ios_g1_v1', 'ios_g1_v1_h1', 'ios_g1_v1_h1', 'ios_g1_v1_g1', 'ios_g1_v1_j1', 'ios_g1_v', 'ios_g1_v1_t1_h', 'ios_g1_v1_t1_f']
這可以是另一種方法
out = []
for filename in filenames:
if filename.split("_")[-1].lower().startswith("y"):
out.append("_".join(filename.split("_")[:-1]))
else:
out.append(filename)
print(out)
您還可以充分利用list()
function 而不是append
一次一個元素:
out = list(
"_".join(filename.split("_")[:-1])
if filename.split("_")[-1].lower().startswith("y")
else filename
for filename in filenames
)
兩種方法都應產生相同的 output:Output:
['ios_g1_v1',
'ios_g1_v1_h1',
'ios_g1_v1_h1',
'ios_g1_v1_g1',
'ios_g1_v1_j1',
'ios_g1_v1',
'ios_g1_v1_t1_h1',
'ios_g1_v1_ty1_f1']
嘗試在檢測到最后一個_
之后刪除所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.