在Python中最后一位切割字符串

时间:2018-08-24 14:39:46

标签: python regex string

所以我有一个日期在中间的字符串,例如111_Joe_Smith_2010_Assessment,我想截断它们,使其变成类似于111_Joe_Smith_2010的字符串。我认为可行的代码是

reverseString = currentString[::-1]
stripper = re.search('\d', reverseString)

但是由于某些原因,这并不总是能给我正确的结果。多数情况下会这样做,但有时会输出类似111_Joe_Smith_2010_A的字符串。

如果有人知道这是怎么回事,那将非常有帮助!

4 个答案:

答案 0 :(得分:5)

您可以使用re.sub$来匹配和替换字母字符  并加下划线直到字符串的结尾:

import re
d = ['111_Joe_Smith_2010_Assessment', '111_Bob_Smith_2010_Test_assessment']
new_s = [re.sub('[a-zA-Z_]+$', '', i) for i in d]

输出:

['111_Joe_Smith_2010', '111_Bob_Smith_2010']

答案 1 :(得分:2)

您可以使用re.sub从字符串末尾去除非数字字符,如下所示:

>>> import re
>>> re.sub(r'\D+$', '', '111_Joe_Smith_2010_Assessment')
'111_Joe_Smith_2010'

对于您的输入格式,您还可以通过一个简单的循环来完成此操作:

>>> s = '111_Joe_Smith_2010_Assessment'
>>> i = len(s) - 1
>>> while not s[i].isdigit():
...     i -= 1
... 
>>> s[:i+1]
'111_Joe_Smith_2010'

答案 2 :(得分:1)

您可以使用以下方法:

def clean_names():
    names = ['111_Joe_Smith_2010_Assessment', '111_Bob_Smith_2010_Test_assessment']
    for name in names:
        while not name[-1].isdigit():
            name = name[:-1]
        print(name)

答案 3 :(得分:1)

这是使用rstrip()删除尾随字母和下划线的另一种解决方案,我认为它是re.sub()的一种非常聪明的替代方法,如其他答案中所使用的:

import string

s = '111_Joe_Smith_2010_Assessment'
new_s = s.rstrip(f'{string.ascii_letters}_')  # For Python 3.6+
new_s = s.rstrip(string.ascii_letters+'_')    # For other Python versions

print(new_s) # 111_Joe_Smith_2010