Como excluir um caractere de uma string usando Python

457

Há uma string, por exemplo. EXAMPLE.

Como posso remover o personagem do meio, ou seja, Mdele? Eu não preciso do código. Eu quero saber:

  • As strings no Python terminam com algum caractere especial?
  • Qual é a maneira melhor - mudar tudo da direita para a esquerda, começando no caractere do meio OU criação de uma nova string e não copiando o caractere do meio?
lazer
fonte

Respostas:

639

No Python, as strings são imutáveis, então você precisa criar uma nova string. Você tem algumas opções de como criar a nova string. Se você deseja remover o 'M' onde quer que ele apareça:

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

Se você deseja remover o caractere central:

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

Você perguntou se as strings terminam com um caractere especial. Não, você está pensando como um programador em C. No Python, as strings são armazenadas com seu comprimento, portanto, qualquer valor de byte, inclusive \0, pode aparecer em uma string.

Ned Batchelder
fonte
16
Como o questionador é novo no python, pode ser interessante notar que, na versão 2.X python, o operador "/" retorna um número inteiro (truncado para zero), na versão 3.X python você deve usar "//" em vez de. Além disso, a linha from __future__ import divisionno início do seu script fará versão 2.x python agir como versão 3.x
Michael Dunn
1
Observe que se "M" é o único conteúdo da linha "", deixa para trás uma linha vazia em seu lugar.
precisa saber é o seguinte
1
@ 7SpecialGems, depende inteiramente do que você faz com essa string. Uma string vazia como ""não implica uma linha vazia. Se você colocá-lo em uma lista e associá-lo a novas linhas, ele criará uma linha vazia, mas há muitos outros lugares em que você pode usar uma string vazia que não fará isso.
Ned Batchelder
68

Esta é provavelmente a melhor maneira:

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

Não se preocupe em mudar de personagem e tal. A maioria dos códigos Python ocorre em um nível muito mais alto de abstração.

recursivo
fonte
6
Mpode não ser único. Nesse caso, isso substituirá todos os Ms, certo?
Lazer
14
Sim esta correto. Se você deseja apenas substituir nocorrências, use original.replace("M", "", n).
recursivo
1
@ S. Lott Eu levei isso para ser retórica, para sugerir fornecer a solução para substituindo apenas uma única instância
Dodgie
63

Para substituir uma posição específica:

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

Para substituir um caractere específico:

s = s.replace('M','')
Eton B.
fonte
18
Embora isso possa funcionar, acho que sua resposta poderia ser melhorada explicando o que está acontecendo na primeira parte, pois as operações de substring não são necessariamente fáceis de entender para um novato em Python sem nenhuma explicação.
Jloubert
Então, se o comprimento de s é l. Então, para a primeira parte, a restrição para pos deve ser l-1 > pos >= 0.
Haoyu Chen
s [: pos] obtém a substring de 0 a pos-1 es [[pos + 1):] obtém a substring da pos + 1 ao final. Portanto, ele remove s [pos] de s.
s.singh
não está substituindo, está caindo. é bom distinguir a operação, fornecendo exemplos para os dois principais casos de uso, separados pelo método de seleção de posição.
Alexander Stohr 17/03
28

Strings são imutáveis. Mas você pode convertê-los em uma lista, que é mutável, e depois converter a lista novamente em uma sequência depois de alterá-la.

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

Você também pode criar uma nova string, como outros mostraram, pegando tudo, exceto o caractere desejado da string existente.

kindall
fonte
4
Por que você não usaria apenas o str.replacemétodo?
Alichaudry 09/08/19
12

Como posso remover o caractere do meio, ou seja, M?

Você não pode, porque as strings em Python são imutáveis .

As strings no Python terminam com algum caractere especial?

Não. Eles são semelhantes às listas de caracteres; o comprimento da lista define o comprimento da cadeia e nenhum caractere atua como um terminador.

Qual é a maneira melhor - mudar tudo da direita para a esquerda, começando no caractere do meio OU criação de uma nova string e não copiando o caractere do meio?

Você não pode modificar a sequência existente, portanto, você deve criar uma nova contendo tudo, exceto o caractere do meio.

Richard Fearn
fonte
11

Use o translate()método:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'
Stefan van den Akker
fonte
3
O método mudou. Consulte a documentação do Python 3: translate () Isso substitui caracteres diferentes por espaço ( Noneremover parece não funcionar):translate( str.maketrans("<>", " ") )
manipula
1
Na verdade, os documentos especificam duas maneiras de remover caracteres diferentes com translate () no Python 3,: str.maketrans( "", "", "<>")estr.maketrans( {"<":None,">":None })
handle
3
O equivalente do código na resposta passou a ser o seguinte em python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi 9/15
7

UserString.MutableString

Maneira mutável:

import UserString

s = UserString.MutableString("EXAMPLE")

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

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)
killown
fonte
3
404 website nenhuma importação
somethingSomething
6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

Como remover um caractere de uma string: Aqui está um exemplo em que há uma pilha de cartões representados como caracteres em uma sequência. Um deles é desenhado (módulo aleatório de importação para a função random.choice (), que seleciona um caractere aleatório na string). Uma nova sequência de caracteres, cardsLeft, é criada para conter as demais cartas fornecidas pela função de sequência replace (), onde o último parâmetro indica que apenas uma "carta" deve ser substituída pela sequência de caracteres vazia ...

StaffanRolfsson
fonte
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

Eu já vi isso em algum lugar aqui .

user1443297
fonte
4

Aqui está o que eu fiz para cortar o "M":

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]
PaulM
fonte
2
Isso funcionaria apenas nessa cadeia específica e não é uma solução geral.
Andreas Bergström
3

Se você deseja excluir / ignorar caracteres em uma sequência e, por exemplo, você tem essa sequência,

"[11: L: 0]"

de uma resposta da API da Web ou algo assim, como um arquivo CSV, digamos que você esteja usando solicitações

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

loop e se livrar de caracteres indesejados:

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

Divisão opcional e você poderá ler os valores individualmente:

listofvalues = line.split(':')

Agora, acessar cada valor é mais fácil:

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

Isso imprimirá

11

eu

0 0

d1jhoni1b
fonte
3

Para excluir uma charou uma sub-string vez (apenas a primeira ocorrência):

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

NOTA: Aqui 1pode ser substituído por qualquer intnúmero de ocorrência que você deseja substituir.

Barba Negra
fonte
3

Você pode simplesmente usar a compreensão da lista.

Suponha que você tenha a string: my name ise deseja remover o caractere m. use o seguinte código:

"".join([x for x in "my name is" if x is not 'm'])
hubert
fonte
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))
Fahrudin Halilović
fonte
2
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código.
18716 Andreas
0

Outra maneira é com uma função,

Abaixo está uma maneira de remover todas as vogais de uma string, apenas chamando a função

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")
Kyoujin
fonte
-7

Strings são imutáveis ​​em Python, portanto, ambas as opções significam a mesma coisa basicamente.

Skilldrick
fonte