Előfordulhat, hogy egy karakterláncban közvetlenül egymás követően több szóköz szerepel, amely a további feldolgozás szempontjából nem kívánatos. Ezért a feladat az, hogy úgy alakítsuk át a karaktersorozatot, hogy minden egynél több, egymás utáni szóköz helyett csak egyetlen egy szerepeljen.
A talán legegyszerűbb megoldás elve, hogy
- megvizsgáljuk, hogy a karakterlánc tartalmaz-e egymást követő két szóközt.
- ha nem, akkor nincs teendő, a karaktersorozat az igényünknek megfelelő.
- ha igen, tartalmaz két egymás utáni szóközt, akkor ezek mindegyikét helyettesítjük egyetlen szóközzel, és újra megtesszük az 1) lépés szerinti ellenőrzést, hiszen lehet, hogy kettőnél több egymást követő szóközök voltak a kiinduló karaktersorozatban.
A fent vázolt lépések szerkezetéből adódóan a megvalósítás akár iterációval (ciklussal), akár rekurzióval történhet, ahogy az alábbi kódsorok mutatják.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Többszörös szóközök eltávolítása karakterláncban. # 1. megoldás iterációval. def egyszeres_szóközökkel(s:str) -> str: while ' '*2 in s: s = s.replace(' '*2, ' ') return s # 2. megoldás rekurzióval. def egyszeres_szóközökkel(s:str) -> str: if ' '*2 not in s: return s s = s.replace(' '*2, ' ') return egyszeres_szóközökkel(s) # TESZT szöveg = ' A b c d\n e \tf g h i ' print(repr(egyszeres_szóközökkel(szöveg))) # Eredmény: ' A b c d\n e \tf g h i ' # A split() metódus csak korlátozottan jó megoldás, mert # nem csak a szóközöket távolítja el, továbbá a # karakterlánc elején és végén levő szóközök is eltűnnek. print(repr(' '.join(szöveg.split()))) # Eredmény: 'A b c d e f g h i' |
A karakterláncok metódusaiban járatosak mondhatnák azt, hogy még egyszerűbb megoldás a split() metódus határolójel-argumentum nélküli alkalmazása, mert ilyenkor a metódus számára az egymást közvetlenül követő, szóköznek számító határolójelek egyetlen határolójelnek számítanak.
Ez a megoldás azonban nem mindig ad kielégítő eredményt, ahogy azt a fenti kód alsó részén az eredményből láthatjuk. Ugyanis a split() számára nem csak az unicode 0x020 kódpontú szóköz számít határolójelnek, hanem többek között például az ‘\n’, ‘\t’, ‘\r’ és ‘\f’ karakterek is. Hogy melyek még, azt a Python tudásépítés lépésről lépésre című e-könyv „Beépített típusok nyilvános metódusai” fejezetében a karakterláncok metódusai ismertetésénél találjuk, ahol a split() metódus használatának részletes leírása is olvasható.