如何删除以特定字符串结尾的字符串



我有这样的文件名

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或yyyymmdd或yyyymmdd或YYYY

我的预期输出将是

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)

如果您的模式涉及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. 开头的下划线
  3. flags=re.IGNORECASE使此模式搜索不区分大小写
  4. Y+匹配Y的至少一个实例
  5. 然后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]

NB。使用re.I,您只需要yyyymmdd/YYYYmmdd中的一个。

压缩变体:

files2 = [re.sub('_YYYY(?:MMDD(?:HHMMSS)?)?$', '', x, flags=re.I) for x in files]

输出:

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

免责声明:这是一个非正则表达式的方法;@mozway发布了一个很好的regex方法

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

这可以是另一种方法

renamed_files = []
for filename in files:
if filename.split("_")[-1].lower().startswith("y"):
renamed_files.append("_".join(filename.split("_")[:-1]))
else:
renamed_files.append(filename)

print(renamed_files)

你也可以很好地利用list()函数,而不是一次一个元素地使用append:

renamed_files = list(
"_".join(filename.split("_")[:-1])
if filename.split("_")[-1].lower().startswith("y")
else filename
for filename in files
)

两种方法应该产生相同的输出:输出:

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

尝试删除最后一次检测到的_之后的所有内容。

相关内容

  • 没有找到相关文章

最新更新