从字符串中删除最后3个字符。

221
我在Python中尝试从字符串中删除最后3个字符,但我不知道这些字符是什么,所以无法使用rstrip,我还需要删除任何空白并将其转换为大写。
一个例子是:
foo = "Bs12 3ab"
foo.replace(" ", "").rstrip(foo[-3:]).upper()

这个代码可以输出我想要的"BS12",但是如果最后4个和3个字符相同,我将会失去它们。例如,如果foo = "BS11 1AA",我只能得到"BS"

foo的例子可能是:

BS1 1AB
bs11ab
BS111ab

字符串可能是6或7个字符长,我需要去掉最后3个字符(假设没有空格)。


1
这个问题有些令人困惑。标题要求删除字符串的最后3个字符,但第一个示例删除了4个字符,并且似乎还有更多的要求,不仅仅是删除给定数量的字符(例如还要去除空格)。 - mkrieger1
1
@mkrieger1 接受的答案似乎回答了四个完全不同的问题,这意味着最初这是一个变色龙问题。我们还有一个更好的规范任务从字符串中删除后缀 - https://dev59.com/lXNA5IYBdhLWcg3wPbSe - 无条件地删除最后几个字符只是一个简单的切片问题,这也被规范很好地涵盖了。我认为这个问题对网站来说毫无用处,尽管它在多年来引起了关注。 - Karl Knechtel
10个回答

411

移除所有空格:

foo = ''.join(foo.split())

删除最后三个字符:

foo = foo[:-3]

转换为大写字母:

foo = foo.upper()

将所有代码写在一行中:

foo = ''.join(foo.split())[:-3].upper()

11
当处理 Unicode 字符串时,''.join(foo.split())foo.replace(' ', '') 更好,因为它除了 ' ' 字符外还会移除任何空白字符(特别是连字符等空格)。但是要注意,replace() 函数可能更快,所以如果输入字符串被知道只包含一个空格字符(比如 ASCII 编码),可以使用它。(这里使用 Python 2 的术语) - Eric O. Lebigot

95

由于strip是基于字符的,所以它不像你期望的那样工作。相反,你需要这样做:

foo = foo.replace(' ', '')[:-3].upper()

11
这并不能满足OP的要求去除空格,它只能去除空格字符。 - John Machin

24
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'

2
@Lidia 是的,strip() 函数只会从字符串的开头和结尾删除空格。 - Eliezer Miron
需要注意的是,您不能像这样链接它:foo[3:]foo[:-3] - crafter

9
您可能对rstrip有些误解,它不是剥离字符串而是剥离您指定的字符串中的任何字符。
像这样:
>>> text = "xxxxcbaabc"
>>> text.rstrip("abc")
'xxxx'

因此,只需使用

即可。
text = text[:-3] 

(去掉空格后)


6
  1. split:分割字符串。
  2. slice:截取数组的一部分并返回一个新数组,不会改变原数组。
  3. concentrate:将多个字符串拼接成一个字符串。

这是适合初学者的好练习,容易实现。

另一种高级方法是像这样的一个函数:

def trim(s):
    return trim(s[slice])

对于这个问题,你只需要删除最后几个字符,所以你可以像这样编写:

def trim(s):
    return s[ : -3] 

我想你过于关注那三个字符,所以你失败了。你只是想要去掉最后三个字符,而不管它们是谁!

如果你想要移除一些特定的字符,可以添加一些条件语句:

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])

4
>>> foo = 'BS1 1AB'
>>> foo.replace(" ", "").rstrip()[:-3].upper()
'BS1'

4
我尽量避免使用正则表达式,但这似乎有效: string = re.sub("\s","",(string.lower()))[:-3]
该代码将字符串中的所有空格删除,并将字符串转换为小写,最后删除最后三个字符。

1
应该使用string.upper()而不是string.lower()。这是我的错误。 - krs1
这是唯一一个很好地处理空格的解决方案。 - Erik Aronesty

1

这有什么问题吗?

foo.replace(" ", "")[:-3].upper()

0

这在某种程度上取决于您对空白符的定义。我通常将空白符称为空格、制表符、换行符和回车符。如果这是您的定义,您可以使用带有\s的正则表达式来替换所有空白字符:

import re

def myCleaner(foo):
    print 'dirty: ', foo
    foo = re.sub(r'\s', '', foo)
    foo = foo[:-3]
    foo = foo.upper()
    print 'clean:', foo
    print

myCleaner("BS1 1AB")
myCleaner("bs11ab")
myCleaner("BS111ab")

0
你是不是把操作顺序弄错了?你的需求似乎应该是 foo[:-3].replace(" ", "").upper()

在问题中指出>>> - Noctis Skytower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接