Як видалити символ із рядка за допомогою 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.