Как удалить символ из строки, используя Python


458

Например, есть строка. EXAMPLE,

Как я могу удалить средний символ, т.е. Mиз него? Мне не нужен код Я хочу знать:

  • Строки в Python заканчиваются каким-либо специальным символом?
  • Что является лучшим способом - сдвигать все справа налево, начиная со среднего символа ИЛИ создания новой строки и не копируя средний символ?

Ответы:


639

В Python строки являются неизменяемыми, поэтому вы должны создать новую строку. У вас есть несколько вариантов создания новой строки. Если вы хотите удалить букву «М» везде, где она появляется:

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

Если вы хотите удалить центральный символ:

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

Вы спросили, заканчиваются ли строки специальным символом. Нет, ты думаешь как программист на Си. В Python строки хранятся с их длиной, поэтому любое значение байта, в том числе \0, может появляться в строке.


16
Учитывая, что спрашивающий является новичком в python, стоит отметить, что хотя в python версии 2.X оператор "/" возвращает целое число (усеченное до нуля), в python версии 3.X следует использовать "//" вместо. Кроме того, строка from __future__ import divisionв начале вашего скрипта заставит Python версии 2.X вести себя как версия 3.X
Майкл Данн

1
Обратите внимание, что если "M" является единственным содержимым строки, "" оставляет за собой пустую строку.
8bitjunkie

1
@ 7SpecialGems это полностью зависит от того, что вы делаете с этой строкой. Пустая строка вроде ""не подразумевает пустую строку. Если вы поместите его в список и присоедините к нему с помощью новых строк, то это сделает пустую строку, но во многих других местах вы можете использовать пустую строку, которая этого не сделает.
Нед Бэтчелдер

68

Это, наверное, лучший способ:

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

Не беспокойтесь о смене персонажей и тому подобное. Большая часть кода Python размещается на гораздо более высоком уровне абстракции.


6
Mне может быть уникальным. В этом случае это заменит все Ms, верно?
Lazer

14
Да, это правильно. Если вы хотите заменить только nвхождения, используйте original.replace("M", "", n).
рекурсивный

1
@ S.Lott Я воспринял это как риторическое, чтобы предложить решение для замены только одного экземпляра
Доджи

63

Чтобы заменить определенную позицию:

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

Чтобы заменить определенный символ:

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

18
Хотя это может сработать, я думаю, что ваш ответ можно улучшить, объяснив, что происходит в первой части, поскольку операции с подстрокой не всегда легко понять новичку в Python без каких-либо объяснений.
Жлобер

Так что, если длина s есть l. Тогда для первой части ограничение для pos должно быть l-1 > pos >= 0.
Хаоюй Чен

s [: pos] получает подстроку от 0 до pos-1, а s [(pos + 1):] получает подстроку от pos + 1 до конца. Следовательно, он удаляет s [pos] из s.
с.сингх

его не заменить, он падает. хорошо различать операцию, предоставляя примеры для двух основных вариантов использования, разделенных методом выбора позиции.
Александр Стор

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

Как я могу удалить средний символ, т. Е. М из него?

Вы не можете, потому что строки в Python неизменны .

Строки в Python заканчиваются каким-либо специальным символом?

Нет, они похожи на списки персонажей; длина списка определяет длину строки, и ни один символ не действует как терминатор.

Что является лучшим способом - сдвигать все справа налево, начиная со среднего символа ИЛИ создания новой строки и не копируя средний символ?

Вы не можете изменить существующую строку, поэтому вы должны создать новую, содержащую все, кроме среднего символа.


11

Используйте translate()метод:

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

3
Метод изменился. См. Документацию по Python 3: translate () Это заменяет различные символы пробелом ( Noneудаление, кажется, не работает):translate( str.maketrans("<>", " ") )
обрабатывать

1
На самом деле, документы определяют два способа удаления разных символов с помощью translate () в Python 3: str.maketrans( "", "", "<>")иstr.maketrans( {"<":None,">":None })
обрабатывать

3
Эквивалент кода в ответе стал таким в python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi


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

Как удалить один символ из строки: Вот пример, где в строке есть стопка карточек, представленных в виде символов. Один из них нарисован (импортировать случайный модуль для функции random.choice (), которая выбирает случайный символ в строке). Новая строка, 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

Я видел это где-то здесь .


4

Вот что я сделал, чтобы вырезать «М»:

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]

2
Это будет работать только с этой конкретной строкой и не является общим решением.
Андреас Бергстрем

3

Если вы хотите удалить / игнорировать символы в строке, и, например, у вас есть эта строка,

"[11: L: 0]"

из ответа веб-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('"', "")

Необязательный split, и вы сможете читать значения по отдельности:

listofvalues = line.split(':')

Теперь доступ к каждому значению стал проще:

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

Это напечатает

11

L

0


3

Чтобы удалить charили один sub-string раз (только первое вхождение):

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

ПРИМЕЧАНИЕ. Здесь 1можно заменить любое intчисло, которое вы хотите заменить.


3

Вы можете просто использовать понимание списка.

Предположим, что у вас есть строка: my name isи вы хотите удалить символ 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
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Андреас

0

Другой способ с функцией,

Ниже приведен способ удалить все гласные из строки, просто вызвав функцию

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

-7

Строки являются неизменяемыми в Python, поэтому оба ваших варианта означают одно и то же.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.