是否有更紧凑和有效的方法从给定列表中删除任何后缀的字符串,即:
sfxs = ['suffix1', 'sfx2', 'suffix333']
s = 'string-to-process-sfx2'
for sfx in sfxs:
i = s.find(sfx)
if not i == -1:
s = s[:i]
break
后缀长度不同
答案 0 :(得分:3)
您可以使用re.sub
。
>>> import re
>>> sfxs = ['suffix1', 'sfx2', 'suffix333']
>>> s = 'string-to-process-sfx2'
>>> re.sub(r'(' + '|'.join(sfxs) + r')$', '',s)
'string-to-process-'
>>> re.sub(r'\b(' + '|'.join(sfxs) + r')$', '',s)
'string-to-process-'
>>> re.sub(r'-(' + '|'.join(sfxs) + r')$', '',s)
'string-to-process'
'|'.join(sfxs)
有助于将suffix
列表与|
作为分隔符加入。因此r'(' + '|'.join(sfxs) + r')$'
会形成像(suff1|suff2|suff3|..)$
这样的正则表达式。请注意$
锚点,它与行尾相匹配。所以这只会在最后进行匹配。
>>> re.sub(r'(' + '|'.join(sorted(sfxs, key=lambda x:len(x), reverse=True)) + r')$', '',s)
'string-to-process-'
答案 1 :(得分:1)
sfxs = ['suffix1', 'sfx2', 'suffix333']
s = 'string-to-process-sfx2'
for sfx in sfxs:
if s.endswith(sfx):
s = s[:-len(sfx)]
break
print(s)
稍微提高效率,因为字符串比较仅查看字符串的结尾。
答案 2 :(得分:0)
sfxs = ['suffix1', 'sfx2', 'suffix333']
s = 'string-to-process-sfx2'
for sfx in sfxs:
if sfx in s:
s.replace(sfx, "")
应该这样做。检查以确保后缀在字符串中,如果是,则将其删除。