如何使用Python从字符串中删除一个字符

568

有一个字符串,例如EXAMPLE

我该如何从中删除中间的字符,即M? 我不需要代码。 我想知道以下内容:

  • Python中的字符串是否以任何特殊字符结尾?
  • 哪种方法更好- 从中间字符开始向右移动所有内容左侧的内容,还是创建一个新字符串并不复制中间字符?

一些示例 https://www.journaldev.com/23674/python-remove-character-from-string - Josh
17个回答

781

在Python中,字符串是不可变的,因此您必须创建一个新的字符串。您有几种选项来创建新的字符串。如果您想要删除“M”无论在哪里出现:

newstr = oldstr.replace("M", "")

如果您想去除中间字符:

midlen = len(oldstr) // 2
newstr = oldstr[:midlen] + oldstr[midlen+1:]

你问字符串是否以特殊字符结尾。不,你的想法像C程序员一样。在Python中,字符串是按其长度存储,因此任何字节值(包括\0)都可以出现在字符串中。


18
考虑到提问者是 Python 的新手,值得注意的是,在 Python 2.X 版本中,"/" 运算符返回一个整数(截断为零),而在 Python 3.X 版本中,应该使用 "//"。此外,在你的脚本开头加上 from __future__ import division 这一行,可以让 Python 2.X 版本的行为像 Python 3.X 版本。 - Michael Dunn
1
请注意,如果“M”是该行唯一的内容,则“”将留下一个空行。 - 8bitjunkie
1
@7SpecialGems 这完全取决于您对该字符串的处理方式。像 "" 这样的空字符串并不意味着空行。如果将其放入列表中,并使用换行符连接它,则会产生一个空行,但是还有许多其他地方可以使用空字符串而不会产生这种效果。 - Ned Batchelder
1
在Python中,Under the hood,字符串也是以空字符结尾的,但这并不重要。 - user3064538

90
替换特定位置:

要替换特定位置:

s = s[:pos] + s[(pos+1):]

替换特定字符:

s = s.replace('M','')

20
虽然这可能有效,但我认为你的回答可以通过解释第一部分中正在发生的事情来改进,因为对于没有任何解释的 Python 初学者来说,子字符串操作并不容易理解。 - jloubert
所以如果s的长度为l。那么对于第一部分,pos的限制应该是l-1 > pos >= 0 - Haoyu Chen
s[:pos] 获取从0到pos-1的子字符串,s[(pos+1):] 获取从pos+1到末尾的子字符串。因此,它从s中删除了s[pos]。 - s.singh
它不是替换,而是删除。通过提供两个主要用例的示例并根据其位置选择方法进行区分,可以很好地区分操作。 - Alexander Stohr

85

这可能是最好的方法:

original = "EXAMPLE"
removed = original.replace("M", "")

不用担心字符移位等问题。大多数Python代码都在更高层次的抽象中进行。


11
M可能并不唯一。如果是这种情况,这将替换所有的M,对吗? - Lazer
22
没问题。如果你只想替换 n 次出现的字符,可以使用 original.replace("M", "", n) - recursive

38

字符串是不可变的。但是你可以将它们转换为列表,列表是可变的,然后在修改后将列表转换回字符串。

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

正如其他人所示,您还可以通过从现有字符串中获取除所需字符以外的所有内容来创建新字符串。


5
为什么不直接使用str.replace方法? - alichaudry
1
你不能使用 str.replace() 来精确替换一个特定字符(例如“索引为10的字符”)。 - kindall

12
使用 translate() 方法:
>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

4
方法已经改变。请参阅 Python 3 文档:translate()。该方法使用 translate(),通过将不同的字符替换为空格来实现(使用 None 来删除字符似乎无法正常工作):translate( str.maketrans("<>", " ") ) - handle
1
实际上,文档指定了两种在Python 3中使用translate()删除不同字符的方法:str.maketrans("", "", "<>")str.maketrans({"<":None,">":None}) - handle
4
答案中的代码在Python3中的等效写法是:'EXAMPLE'.translate({ord("M"): None}) - yoniLavi

12

如何从字符串中去掉中间的字符M?

无法删除,因为Python中的字符串是不可变对象

Python中的字符串是否以特殊字符结尾?

不是。它们类似于字符列表;列表的长度定义了字符串的长度,没有任何字符作为终结符。

哪种方法更好——从中间字符开始向右移动所有内容,还是创建一个新字符串并不复制中间的字符?

你不能修改现有的字符串,因此必须创建一个新字符串,其中包含除中间字符外的所有内容。


9
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

我在某个地方看到过这个东西,在这里


6
在Python 2中,您可以使用UserString.MutableString以可变的方式进行操作:
>>> import UserString
>>> s = UserString.MutableString("EXAMPLE")
>>> type(s)
<class 'UserString.MutableString'>
>>> del s[3]    # Delete 'M'
>>> s = str(s)  # Turn it into an immutable value
>>> s
'EXAPLE'

MutableString 在 Python 3 中已被移除。


3
404 网站无法访问 - somethingSomething

6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

如何从字符串中删除一个字符: 下面是一个例子,其中卡牌以字符的形式表示为字符串。 从中抽取一张(导入随机模块以使用random.choice()函数,在字符串中选择一个随机字符)。 创建一个新字符串cardsLeft,用replace()函数忽略掉其中一个“卡牌”,将其替换为空字符串,从而得到剩余的卡牌字符串...


3
另一种方法是使用函数,
下面是一种只需调用函数即可从字符串中删除所有元音字母的方法。
def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

4
你的意思是s.translate(str.maketrans("", "", "aeiouAEIOU"))吗? - Dyno Fu
@DynoFu 我认为这就是他的意思,因为你的回答是整个帖子中唯一有意义的。如果需要删除其他字符,所有其他回答都会变得非常复杂。 - not2qubit

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