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.