簡體   English   中英

如何刪除以特定字符串結尾的字符串

[英]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']

解釋

  1. _匹配模式開頭的下划線
  2. flags=re.IGNORECASE使此模式搜索不區分大小寫
  3. Y+至少匹配Y的 1 個實例
  4. 然后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM