从字符串中删除字符,直到达到特定格式

Remove Characters From A String Until A Specific Format is Reached

所以我有以下字符串,并且我一直在尝试弄清楚如何以一种获得特定格式的方式来操作它们。

string1-itd_jan2021-internal
string2itd_mar2021-space
string3itd_feb2021-internal
string4-itd_mar2021-moon
string5itd_jun2021-internal
string6-itd_feb2021-apollo

我希望能够去掉最后一个字符串,这样我就只剩下月份和年份了,如下所示:

string1-itd_jan2021
string2itd_mar2021
string3itd_feb2021
string4-itd_mar2021
string5itd_jun2021
string6-itd_feb2021

我考虑过在 - 上使用 string.split,但后来意识到这对于某些字符串不起作用。我还考虑过通过将其放入列表并切片来摆脱一定数量的字符,但最后是不同的字符长度?

我可以用正则表达式或任何其他 python 模块做些什么吗?

使用 str.rsplit 和适当的 maxsplit 参数:

s = s.rsplit("-", 1)[0]

您也可以使用 str.split(尽管这显然是更糟糕的选择):

s = "-".join(s.split("-")[:-1])

或使用正则表达式:

s = re.sub(r'-[^-]*$', '', s)
# "-[^-]*" a "-" followed by any number of non-"-"

像这样使用re.sub

import re
lines = '''string1-itd_jan2021-internal
string2itd_mar2021-space
string3itd_feb2021-internal
string4-itd_mar2021-moon
string5itd_jun2021-internal
string6-itd_feb2021-apollo'''

for old in lines.split('\n'):
    new = re.sub(r'[-][^-]+$', '', old)
    print('\t'.join([old, new]))

打印:

string1-itd_jan2021-internal    string1-itd_jan2021
string2itd_mar2021-space        string2itd_mar2021
string3itd_feb2021-internal     string3itd_feb2021
string4-itd_mar2021-moon        string4-itd_mar2021
string5itd_jun2021-internal     string5itd_jun2021
string6-itd_feb2021-apollo      string6-itd_feb2021

解释:
r'[-][^-]+$' :文字短划线 (-),后跟除短划线以外的任何字符 ([^-]) 重复 1 次或多次,后跟字符串结尾 ($ ).

使用正则表达式:

import re
re.sub(r'([0-9]{4}).*$', r'', s)

您可以使用 rpartition 作为另一种方法,如下所示:

>>> content = ['string1-itd_jan2021-internal' , 'string2itd_mar2021-space' , 'string3itd_feb2021-internal' , 'string4-itd_mar2021-moon' , 'string5itd_jun2021-internal' ,'string6-itd_feb2021-apollo' ]

>>> [c.rpartition('-')[0] for c in content]
['string1-itd_jan2021',
 'string2itd_mar2021',
 'string3itd_feb2021',
 'string4-itd_mar2021',
 'string5itd_jun2021',
 'string6-itd_feb2021']