Як видалити символ із рядка за допомогою Python


457

Наприклад, є рядок. EXAMPLE.

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

  • Чи закінчуються рядки в Python яким-небудь спеціальним символом?
  • Що є кращим способом - зміщення всього праворуч ліворуч, починаючи з середнього символу АБО створення нового рядка, а не копіювання середнього символу?

Відповіді:


638

У Python рядки незмінні, тому вам доведеться створити новий рядок. У вас є кілька варіантів, як створити новий рядок. Якщо ви хочете видалити 'M', де б він не з’явився:

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

Якщо ви хочете видалити центральний символ:

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

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


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

1
Зауважте, що якщо "M" - єдиний вміст рядка, "" залишає після себе порожній рядок.
8bitjunkie

1
@ 7SpecialGems це повністю залежить від того, що ви робите з цим рядком. Порожній рядок типу ""не означає порожній рядок. Якщо ви помістите його в список і приєднаєте його до нових рядків, тоді він зробить порожній рядок, але є багато інших місць, де ви можете використовувати порожній рядок, який цього не зробить.
Нед Батчелдер

68

Це, мабуть, найкращий спосіб:

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

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


6
Mможе бути не унікальним. У такому випадку це замінить усі Ms, так?
Лазер

14
Так, це правильно. Якщо ви хочете замінити лише nподії, скористайтеся original.replace("M", "", n).
рекурсивна

1
@ S.Lott Я вважав це риторичним, пропоную запропонувати рішення замінити лише один екземпляр
Dodgie

63

Щоб замінити конкретну посаду:

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

Щоб замінити певний символ:

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

18
Хоча це може спрацювати, я думаю, що вашу відповідь можна було б покращити, пояснивши, що відбувається в першій частині, оскільки операції з підрядкою не обов'язково легко зрозуміти для новачка Python без будь-яких пояснень.
jloubert

Отже, якщо довжина s дорівнює l. Тоді для першої частини обмеженням для пози повинно бути l-1 > pos >= 0.
Haoyu Chen

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
Насправді, документи задають два способи видалення різних символів з трансляцією () у 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 (), який вибирає випадковий символ у рядку). Новий рядок, cardLeft, створений для зберігання решти карт, заданих функцією string, заміни (), де останній параметр вказує, що лише одну "карту" слід замінити порожньою рядком ...


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
Це працювало б лише для цієї конкретної рядки і не є загальним рішенням.
Andreas Bergström

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('"', "")

Необов’язково розділити, і ви зможете читати значення окремо:

listofvalues = line.split(':')

Тепер доступ до кожного значення простіше:

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

Це надрукується

11

L

0


3

Щоб видалити a 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
Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду.
andreas

0

Інший спосіб - це функція,

Нижче наведено спосіб видалити всі голосні з рядка, просто зателефонувавши до функції

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

-7

Струни незмінні в Python, тому обидва варіанти в основному означають одне і те ж.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.