我有这样的文件名
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']
解释_
匹配模式 开头的下划线flags=re.IGNORECASE
使此模式搜索不区分大小写Y+
匹配Y
的至少一个实例- 然后
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']
尝试删除最后一次检测到的_
之后的所有内容。