regex 如何删除以结尾字符串

2uluyalo  于 2023-01-03  发布在  其他
关注(0)|答案(6)|浏览(181)

我有这样的文件名

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匹配的后缀
我的预期输出是

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中使用regex来实现这个呢?我尝试了类似下面的方法,但是没有成功

word_trimmed_stage1 = re.sub('.*[^YYYYMMDDHHMMSS]$', '', filename)
rpppsulh

rpppsulh1#

您可以显式地使用已标识的确切模式,也可以选择不区分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]

输出:

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

t9aqgxwy2#

要删除以"YYYYMMDDHHMMSS"或其他指定格式结尾的字符串,可以使用rstrip方法。此方法将删除指定字符串中出现在目标字符串末尾的所有字符。
下面是如何使用它的示例:s ="abcdefgYYYYMMDDHHMMSS"后缀="YYYYMMDDHHMMSS"
也可以使用将"YYYYMMDDHHMMSS"替换为适当的格式字符串,来删除其他指定格式。

7vhp5slm

7vhp5slm3#

**免责声明:**这是一个非正则表达式的方法;@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']
vfhzx4xs

vfhzx4xs4#

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.然后,M*D*H*M*S*按顺序匹配初始Y之后这些特定字符的任何示例(从0个示例开始)
hsvhsicv

hsvhsicv5#

这可以是另一种方法

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

输出:

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

k7fdbhmy6#

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

相关问题