Jak usunąć znak z ciągu przy użyciu Pythona


457

Na przykład jest ciąg znaków. EXAMPLE.

Jak mogę usunąć środkową postać, tj. MZ niej? Nie potrzebuję kodu. Chcę wiedzieć:

  • Czy ciągi w Pythonie kończą się jakimś znakiem specjalnym?
  • Który jest lepszy sposób - przesunięcie wszystkiego od prawej do lewej, zaczynając od środkowego znaku LUB utworzenie nowego ciągu znaków, a nie kopiowanie środkowego znaku?

Odpowiedzi:


638

W Pythonie ciągi są niezmienne, więc musisz utworzyć nowy ciąg. Masz kilka opcji, jak utworzyć nowy ciąg. Jeśli chcesz usunąć „M”, gdziekolwiek się pojawi:

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

Jeśli chcesz usunąć centralny znak:

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

Zapytałeś, czy ciągi kończą się znakiem specjalnym. Nie, myślisz jak programista C. W Pythonie ciągi są przechowywane wraz z ich długością, więc każda wartość bajtu, w tym \0, może pojawić się w ciągu.


16
Biorąc pod uwagę fakt, że pytający jest zupełnie nowy w Pythonie, warto zauważyć, że podczas gdy w wersji 2.X python operator „/” zwraca liczbę całkowitą (obciętą do zera), w wersji 3.X python powinieneś użyć „//” zamiast. Ponadto wiersz from __future__ import divisionna początku skryptu sprawi, że wersja 2.X python będzie działać jak wersja 3.X
Michael Dunn

1
Zauważ, że jeśli „M” jest jedyną zawartością linii, „” pozostawia pustą linię na swoim miejscu.
8bitjunkie

1
@ 7SpecialGems zależy całkowicie od tego, co robisz z tym ciągiem. Pusty ciąg jak ""nie oznacza pustej linii. Jeśli umieścisz go na liście i połączysz z nowymi wierszami, utworzy on pustą linię, ale istnieje wiele innych miejsc, w których możesz użyć pustego ciągu, który tego nie zrobi.
Ned Batchelder,

68

To prawdopodobnie najlepszy sposób:

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

Nie martw się o zmiany postaci i tym podobne. Większość kodu Pythona odbywa się na znacznie wyższym poziomie abstrakcji.


6
Mmoże nie być wyjątkowy. W takim przypadku zastąpi to wszystkie Ms, prawda?
Lazer

14
Tak, to jest poprawne. Jeśli chcesz tylko zastąpić nwystąpienia, użyj original.replace("M", "", n).
rekurencyjny

1
@ S.Lott Uznałem to za retoryczne, aby zasugerować dostarczenie rozwiązania zastępującego tylko jedną instancję
Dodgie

63

Aby zastąpić określoną pozycję:

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

Aby zastąpić określony znak:

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

18
Chociaż może to działać, myślę, że twoją odpowiedź można poprawić, wyjaśniając, co się dzieje w pierwszej części, ponieważ operacje podłańcuchowe niekoniecznie są łatwe do zrozumienia dla początkującego Pythona bez żadnego wyjaśnienia.
joulbert

Więc jeśli długość s wynosi l. Następnie dla pierwszej części powinno być ograniczenie dla pos l-1 > pos >= 0.
Haoyu Chen,

s [: pos] pobiera podłańcuch od 0 do pos-1, a s [(pos + 1):] pobiera podłańcuch od pos + 1 do końca. Dlatego usuwa s [pos] z s.
s.singh

nie zastępuje, spada. dobrze jest rozróżnić operację, podając przykłady dla obu dwóch głównych przypadków użycia, oddzielonych metodą wyboru pozycji.
Alexander Stohr

28

Ciągi są niezmienne. Ale możesz przekonwertować je na listę, która jest zmienna, a następnie po jej zmianie przekonwertować listę z powrotem na ciąg.

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

Możesz również utworzyć nowy ciąg, jak pokazali inni, biorąc wszystko oprócz znaku, który chcesz z istniejącego ciągu.


4
Dlaczego nie skorzystasz z tej str.replacemetody?
alichaudry

12

Jak mogę usunąć z niego środkową postać, tj. M?

Nie możesz, ponieważ ciągi w Pythonie są niezmienne .

Czy ciągi w Pythonie kończą się jakimś znakiem specjalnym?

Nie. Są one podobne do list znaków; długość listy określa długość łańcucha i żaden znak nie działa jako terminator.

Który jest lepszy sposób - przesunięcie wszystkiego od prawej do lewej, zaczynając od środkowego znaku LUB utworzenie nowego ciągu znaków, a nie kopiowanie środkowego znaku?

Nie możesz zmodyfikować istniejącego ciągu, więc musisz utworzyć nowy zawierający wszystko oprócz środkowego znaku.


11

Użyj translate()metody:

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

3
Metoda uległa zmianie. Zobacz docs dla Pythona 3: translate () Zastępuje różne znaki z przestrzeni ( Noneaby usunąć nie wydaje się pracy):translate( str.maketrans("<>", " ") )
rączka

1
W rzeczywistości dokumenty określają dwa sposoby usuwania różnych znaków za pomocą translate () w Pythonie 3: str.maketrans( "", "", "<>")istr.maketrans( {"<":None,">":None })
obsłużenie

3
Odpowiednikiem kodu w odpowiedzi stał się ten w python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi

7

UserString.MutableString

Zmienny sposób:

import UserString

s = UserString.MutableString("EXAMPLE")

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

# Delete 'M'
del s[3]

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

3
Witryna 404 bez importu
coś

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

Jak usunąć jedną postać z ciągu: Oto przykład, w którym znajduje się stos kart reprezentowanych jako znaki w ciągu. Jeden z nich jest rysowany (importuj losowy moduł dla funkcji random.choice (), która wybiera losowy znak w ciągu). Tworzony jest nowy ciąg, cardsLeft, do przechowywania pozostałych kart podanych przez funkcję ciągu replace (), gdzie ostatni parametr wskazuje, że tylko jedna „karta” ma zostać zastąpiona pustym ciągiem ...


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

Widziałem to gdzieś tutaj .


4

Oto, co zrobiłem, aby wyciąć „M”:

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

2
To działałoby tylko dla tego konkretnego ciągu i nie jest ogólnym rozwiązaniem.
Andreas Bergström

3

Jeśli chcesz usunąć / zignorować znaki w ciągu i na przykład masz ten ciąg,

„[11: L: 0]”

z odpowiedzi interfejsu API sieci Web lub czegoś takiego, np. pliku CSV, powiedzmy, że używasz żądań

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

zapętlić i pozbyć się niechcianych znaków:

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

Opcjonalny podział, a będziesz mógł odczytać wartości indywidualnie:

listofvalues = line.split(':')

Teraz dostęp do każdej wartości jest łatwiejszy:

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

To zostanie wydrukowane

11

L.

0


3

Aby usunąć jeden charlub jeden sub-string raz (tylko pierwsze wystąpienie):

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

UWAGA: Tutaj 1można zastąpić dowolną intliczbą wystąpień, które chcesz zastąpić.


3

Możesz po prostu użyć listy.

Załóżmy, że masz ciąg znaków: my name isi chcesz usunąć znak m. użyj następującego kodu:

"".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
Ten fragment kodu może rozwiązać pytanie, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu.
andreas

0

Innym sposobem jest funkcja

Poniżej znajduje się sposób na usunięcie wszystkich samogłosek z ciągu, po prostu przez wywołanie funkcji

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.