Jak nahradit znak v řetězci pomocí Pythonu

Tento návod se zaměřuje na různé způsoby, jak v Pythonu zaměnit znaky v textovém řetězci. Probereme možnosti, které nabízí vestavěné metody, regulární výrazy a jiné techniky.

V Pythonu jsou textové řetězce implementovány jako datové struktury, které uchovávají posloupnosti znaků v kódování Unicode. Na rozdíl od některých proměnlivých struktur, jako jsou seznamy a slovníky, jsou řetězce v Pythonu neměnné. To znamená, že jakmile je řetězec vytvořen, nemůžete ho přímo modifikovat.

Při práci s textem však často potřebujeme provádět úpravy – ať už se jedná o odstranění mezer, změnu velikosti písmen nebo právě náhradu jednoho znaku jiným.

Jak tedy můžeme textové řetězce v Pythonu efektivně upravovat? A konkrétně, jak nahradit jeden znak jiným? Na tyto otázky odpovíme v tomto článku. Zaměříme se na:

  • Specifika neměnnosti řetězců v Pythonu
  • Metody Pythonu pro manipulaci s textem
  • Různé strategie pro nahrazování znaků

Začněme!

Neměnnost řetězců v Pythonu

Jak už bylo řečeno, textové řetězce v Pythonu jsou neměnné. Nemůžete tedy přímo editovat existující řetězec na místě.

Například, máme-li řetězec „Programování v Pythonu!“, můžeme k jednotlivým prvkům přistupovat pomocí indexů, nebo si vyžádat podřetězec pomocí řezu:

>>> muj_retezec = "Programování v Pythonu!"
>>> muj_retezec[0]
'P'
>>> muj_retezec[4]
'r'
>>> muj_retezec[1:9]
'rogramov'
>>> muj_retezec[9]
'á'

Předpokládejme, že chceme nahradit písmeno „o“ číslicí „0“.

Víme, že písmeno „o“ se v tomto řetězci nachází na indexech 4 a 9. Pokusíme-li se na dané pozici přímo znak nahradit, Python vyvolá chybu:

>>> muj_retezec[4] = '0'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

Python nabízí sadu metod, které sice na existující řetězec přímo nemanipulují, ale vrací nový řetězec s požadovanými úpravami.

K provádění manipulací s textem se běžně používají metody řetězců v kombinaci s technikami jako jsou seznamové komprehenze, smyčky a regulární výrazy. V tomto článku se podíváme na různé strategie, jak v Pythonu nahradit znak.

Nahrazení znaku v řetězcích Python

Existuje mnoho situací, kdy může být potřeba nahradit znaky nebo podřetězce v řetězci Pythonu. Mezi tyto situace patří například:

  • Čištění textu: Při zpracování textových dat je často potřeba odstranit nebo nahradit speciální znaky, nadbytečné mezery nebo jiné nežádoucí symboly.
  • Formátování: Často se setkáme s nutností změnit formát textu, například sjednocení velikosti písmen v nadpisech.
  • Maskování dat: Při práci s citlivými informacemi je klíčové maskovat osobní údaje, jako jsou čísla občanských průkazů nebo kreditních karet.
  • Zpracování URL a cest: Při práci s webovými adresami nebo cestami k souborům je někdy nutné nahradit určité znaky, aby byly kompatibilní s webovými prohlížeči nebo souborovými systémy.

Podíváme se na jednoduchý příklad, kdy nahrazujeme jeden znak jiným.

Začneme přístupem s použitím smyček a podmíněných příkazů, a poté se zaměříme na efektivnější metody.

Opět se podíváme na příklad, kdy nahrazujeme písmeno „o“ číslicí „0“ v řetězci „Programování v Pythonu!“.

Zde je příklad, jak můžeme projít řetězec pomocí smyčky `for` a provést náhradu:

originalni_retezec = "Programování v Pythonu!"
novy_retezec = ""
for znak in originalni_retezec:
    if znak == "o":
        novy_retezec += "0"
    else:
        novy_retezec += znak
print(novy_retezec)

V tomto řešení procházíme původní řetězec znak po znaku. Pokud narazíme na „o“, přidáme do nového řetězce „0“. Jinak přidáme původní znak. Tímto způsobem vytvoříme nový řetězec s provedenými náhradami.

# Výstup
Pr0gram0vání v Pyth0nu!

Použití smyčky `for` a podmíněných příkazů může být ale komplikované. Zejména v případě, že potřebujeme nahradit podřetězce nebo více znaků najednou.

Existují efektivnější přístupy a ty si nyní představíme.

#1. Použití str.replace()

Pro náhradu znaku nebo podřetězce jiným řetězcem můžeme použít metodu `replace()`. Použití `str.replace(stary, novy)` nahradí všechny výskyty starého řetězce novým řetězcem.

Zde použijeme metodu `replace()` pro nahrazení písmene „o“ číslicí „0“.

originalni_retezec = "Programování v Pythonu!"
novy_retezec = originalni_retezec.replace("o", "0")
print(novy_retezec)

Výsledný řetězec se uloží do `novy_retezec`.

# Výstup
Pr0gram0vání v Pyth0nu!

#2. Použití List Comprehension a metody join()

Pro nahrazení znaku můžeme využít kombinaci seznamové komprehenze a metody `join()`.

Jak můžeme upravit náš příklad:

  • Pomocí seznamové komprehenze projdeme všechny znaky v původním řetězci. Pokud je aktuální znak roven „o“, nahradíme ho „0“. V opačném případě znak ponecháme beze změny.
  • Poté použijeme metodu `str.join()` ke spojení upravených znaků do nového řetězce.
originalni_retezec = "Programování v Pythonu!"
novy_retezec = ''.join(['0' if znak == 'o' else znak for znak in originalni_retezec])
print(novy_retezec)

Výstup bude následující:

# Výstup
Pr0gram0vání v Pyth0nu!

#3. Použití regulárních výrazů

Další metodou, jak nahradit znaky, je použití regulárních výrazů. Python obsahuje modul `re`, který nabízí nástroje pro práci s regulárními výrazy. Pomocí regulárního výrazu můžeme definovat vzor, ​​který chceme v řetězci vyhledat a čím ho nahradit.

Zde použijeme funkci `sub()` ze zmiňovaného modulu, kde syntaxe je `re.sub(vzor, nahrazeni, retezec)`.

import re

originalni_retezec = "Programování v Pythonu!"
novy_retezec = re.sub(r'o', '0', originalni_retezec)
print(novy_retezec)

Vzor `r’o’` odpovídá každému výskytu písmene „o“ a nahradí ho číslicí „0“.

# Výstup
Pr0gram0vání v Pyth0nu!

Regulární výrazy můžeme využít i pro složitější vzory. Podívejme se na příklad maskování čísel kreditních karet. Chceme nahradit všechny číslice kromě posledních čtyř znakem „X“.

import re

def maskovani_kreditky(cislo_karty):
    maskovane_cislo = re.sub(r'\d(?=\d{4})', 'X', cislo_karty)
    return maskovane_cislo

cislo_karty = "1234567898765432"
maskovane_cislo = maskovani_kreditky(cislo_karty)
print(maskovane_cislo)

A výstup:

# Výstup
XXXXXXXXXXXX5432

Pro zjednodušení jsme v tomto příkladu vynechali pomlčky, ale regulární výraz se dá upravit dle potřeby.

#4. Použití str.maketrans() a str.translate()

Metody `str.maketrans()` a `str.translate()` se v Pythonu využívají pro provádění náhrady znaků.

Jak funguje str.maketrans()

Metoda `maketrans()` vytvoří překladovou tabulku. Tabulka specifikuje, jaké znaky se mají v řetězci nahradit. Používá se ve formátu `str.maketrans(x, y)`, kde:

  • `x` je řetězec znaků, které chceme nahradit.
  • `y` je řetězec, kterým chceme `x` nahradit.

Metoda `maketrans()` vygeneruje tabulku mapování z `x` na `y`. Tuto tabulku pak lze použít spolu s `str.translate()` pro provedení samotné náhrady.

Jak funguje str.translate()

Metoda `str.translate()` aplikuje překladovou tabulku vytvořenou pomocí `str.maketrans()` na řetězec. Provádí náhradu znak po znaku podle mapování v tabulce. A vrací nový řetězec s aplikovanými změnami.

Zde je ukázka použití metody `translate()`:

novy_retezec = originalni_retezec.translate(prekladova_tabulka)
  • `originalni_retezec`: Vstupní řetězec, který chceme upravit.
  • `prekladova_tabulka`: Překladová tabulka vytvořená pomocí `str.maketrans()`.

Kombinací metod `maketrans()` a `str.translate()` můžeme náš příklad zapsat takto:

originalni_retezec = "Programování v Pythonu!"
prekladova_tabulka = str.maketrans('o', '0')
novy_retezec = originalni_retezec.translate(prekladova_tabulka)
print(novy_retezec)

Zde vytvoříme tabulku pomocí `str.maketrans(‚o‘, ‚0‘)`, která nahradí všechny výskyty písmene „o“ číslicí „0“. Pak použijeme metodu `translate()` pro aplikaci této tabulky na původní řetězec.

# Výstup
Pr0gram0vání v Pyth0nu!

Tyto metody jsou velmi efektivní pro náhradu znaků a další manipulace na úrovni znaků.

Závěr

Shrňme, co jsme se naučili.

Řetězce v Pythonu jsou neměnné. Pokud tedy potřebujeme nahradit znak v řetězci, nemůžeme provést pouhou změnu na konkrétní pozici. Představili jsme si následující přístupy pro nahrazení jednoho nebo více znaků v řetězci Pythonu:

  • Použijte `str.replace(stary, novy)` k nahrazení všech výskytů `stary` novým podřetězcem.
  • Můžeme kombinovat seznamovou komprehenzi s metodou `join()`. Seznamová komprehenze umožní definovat nahrazení znaků a metoda `join()` spojí upravené znaky do nového řetězce.
  • Pro komplexnější vzory lze využít regulární výrazy. Použijeme funkci `sub()` s voláním `re.sub(vzor, nahrazeni, retezec)`.
  • Metodou `str.maketrans()` vytvoříme překladovou tabulku, kterou pak aplikujeme pomocí `translate()` na původní řetězec.

Vyzkoušejte si tyto techniky na několika příkladech, abyste jim lépe porozuměli. Příště se podíváme, jak můžeme odstranit poslední znak z řetězce.