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


457

例如,有一个字符串。EXAMPLE

如何从中删除中间字符M?我不需要代码。我想知道:

  • Python中的字符串是否以任何特殊字符结尾?
  • 哪种更好的方法-从中间字符开始或从创建新字符串开始,将所有内容从右移到左,而不是复制中间字符?

Answers:


638

在Python中,字符串是不可变的,因此您必须创建一个新字符串。您有一些有关如何创建新字符串的选项。如果要删除出现的“ M”,请执行以下操作:

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

如果要删除中心字符:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

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


16
鉴于发问者是python的新手,可能值得注意的是,在2.X python版本中,“ /”运算符返回一个整数(截断为零),而在3.X python版本中,您应使用“ //”代替。另外,from __future__ import division脚本开头的这一行将使2.X版的python像3.X版一样
Michael Dunn 2010年

1
请注意,如果“ M”是该行的唯一内容,则“”将留在空白行的位置。
8bitjunkie 2015年

1
@ 7SpecialGems它完全取决于您对该字符串的处理方式。像""这样的空字符串并不表示空行。如果将其放在列表中并与换行符连接,则它将形成一个空行,但是在很多其他地方,您可能会使用一个空字符串,但不会这样做。
Ned Batchelder 2015年

68

这可能是最好的方法:

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

不用担心字符转移等问题。大多数Python代码以更高的抽象级别进行。


6
M可能不是唯一的。在这种情况下,它将替换所有的Ms,对不对?
Lazer

14
对,那是正确的。如果只想替换n事件,请使用original.replace("M", "", n)
递归

1
@ S.Lott我认为这只是一种夸夸其谈,建议提供仅替换一个实例的解决方案
Dodgie 2015年

63

要替换特定职位:

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

替换特定字符:

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

18
尽管这可能行得通,但我认为可以通过解释第一部分的内容来改善您的答案,因为对于没有任何解释的Python新手来说,子字符串操作不一定容易理解。
jloubert

因此,如果s的长度为l。然后对于第一部分,pos的约束应为l-1 > pos >= 0
陈浩宇2015年

s [:pos]的子字符串从0到pos-1,而s [(pos + 1):]的子字符串从pos + 1到结尾。因此,它从s中删除s [pos]。
s.singh,

它没有取代,它下降了。最好通过提供两个主要用例的示例(通过位置选择方法分开)来区分操作。
亚历山大·斯托尔

28

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

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

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


4
您为什么不只使用该str.replace方法?
alichaudry

12

如何从中删除中间字符(即M)?

您不能,因为Python中的字符串是不可变的

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

不。它们类似于字符列表。列表的长度定义字符串的长度,并且没有字符充当终止符。

哪种更好的方法-从中间字符开始或从创建新字符串开始,将所有内容从右移到左,而不是复制中间字符?

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


11

使用translate()方法:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

3
方法已更改。请参阅Python 3的文档:translate()这将空格替换为不同的字符(None以删除似乎无效):translate( str.maketrans("<>", " ") )
处理

1
:其实,在文档指定两种方法可以删除不同的字符在Python 3,翻译()str.maketrans( "", "", "<>")str.maketrans( {"<":None,">":None })
手柄

3
答案中的等效代码在python3中变为:'EXAMPLE'.translate({ord("M"): None})
yoniLavi 2015年

7

UserString.MutableString

可变方式:

import UserString

s = UserString.MutableString("EXAMPLE")

>>> type(s)
<type 'str'>

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)

3
404网站未导入
某事

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

如何从字符串中删除一个字符: 这是一个示例,其中有一堆卡表示为字符串中的字符。其中一个被绘制(为random.choice()函数导入random模块,该函数从字符串中选择一个随机字符)。创建了一个新字符串cardsLeft,以容纳由字符串函数replace()给出的剩余卡片,其中最后一个参数指示仅一个“卡片”将被空字符串替换...


6
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

我看到这个地方在这里



3

如果您要删除/忽略字符串中的字符,例如,您拥有此字符串,

“ [11:L:0]”

来自Web API响应或类似CSV文件之类的信息,假设您正在使用请求

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

循环并摆脱不需要的字符:

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

可选拆分,您将能够单独读取值:

listofvalues = line.split(':')

现在访问每个值更容易:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

这将打印

11

大号

0


3

删除一次charsub-string 一次(仅第一次出现):

main_string = main_string.replace(sub_str, replace_with, 1)

注意:在这里1可以用任何int您要替换的出现次数替换。


3

您可以简单地使用列表理解。

假设您有字符串:,my name is并且想要删除character m。使用以下代码:

"".join([x for x in "my name is" if x is not 'm'])

0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))

2
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
andreas

0

另一种方法是使用函数

下面是一种仅通过调用函数即可从字符串中删除所有元音的方法

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

-7

字符串在Python中是不可变的,因此您的两个选项基本上意味着同一件事。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.