Karakterlánc (String)

Megtanultuk eddig hogyan lehet egyszerû stringeket megadni. Most egy kicsit mélyebben megvizsgáljuk õket.

Több soros string

Elõször is, tudunk több soros stringet létrehozni, ha 3 " vagy '-t használunk:

In [ ]:
s1 = """Volt egyszer egy kiskutya.
Elment a vasarba.
Harmadik sor."""
In [ ]:
print s1

Ugyanez sima "-el:

In [ ]:
s2 = "Volt egyszer egy kiskutya.\nElment a vasarba.\nHarmadik sor."
In [ ]:
print s2

Tehát a \n jelenti a sortörést a stringekben. Ez majdnem minden programnyelvben így van.

Speciális karakterek

Néhány hasznos (és kevésbe hasznos) hasonló speciális karakter:

In [ ]:
sipolo_karakter = "\a" # manapság már nem támogatott :(
uj_sor = "\n"
kocsi_vissza = "\r"
horizontalis_tab = "\t" # ez az amit ismertek
vertikalis_tab = "\v" # ez az amit nem
forditott_per = "\\"
egyes_idezojel = "\'"
kettes_idezojel = "\""

A vicceseken kívül érdemes ezeket ismerni. (Vicces: \a, \r, \v)

A tab kényelmessé tesz mátrixot kiírni például:

In [ ]:
matrix = [[1, -2, 30], [4, 3, 1], [-21, 23, 11]]
for sor in matrix:
    for elem in sor:
        print elem, "\t",
    print ""

Nem szép, de nem is kellett vele sokat dolgozni.

Egyszerû string mûveletek

Részstring lekérés:

In [ ]:
s = "Elsomasodikharmadik"
print s[:4]
print s[4:11]
print s[11:]

Összefûzés is volt már említve, vigyázzunk, hogy stringet csak stringgel lehet összeadni!

In [ ]:
s = "kiskutya"
print "5 " + s
In [ ]:
s = "kiskutya"
mennyiseg = 5
print mennyiseg + s
In [ ]:
s = "kiskutya"
mennyiseg = 5
print str(mennyiseg) + " " + s

Tehát az str függvénnyel tudunk változókat stringgé alakítani.

Hasznos string metódusok

In [ ]:
s = "pelda mondat Taylor Swift"

Nagybetûvel kezdés:

In [ ]:
s.capitalize()

Csupa nagybetûvé tevés:

In [ ]:
s.upper()

Csupa kisbetûvé tevés:

In [ ]:
s.lower()

Csak az ábécé betûit tartalmazza-e (emlékeztetõ: a szóköz nem az ábécé betûje):

In [ ]:
s.isalpha()

Formázás

Igazítás

In [ ]:
s = "egy kiskutya"
In [ ]:
s.center(30)
In [ ]:
s.rjust(30)
In [ ]:
s.ljust(30)

A paraméterként átadott érték szabályozza a létrejött string hosszát.

Nézzük meg a mátrixot újra:

In [ ]:
matrix = [[1, -2, 30], [4, 3, 1], [-21, 23, 11]]
matstr = ""
for sor in matrix:
    for elem in sor:
        matstr += str(elem).rjust(5)
    matstr += "\n"
print matstr

Whitespace levágás

Amikor fájlmûveleteket végzünk hasznos lehet:

In [ ]:
felesleges = """
    felesleges sortoressel es szokozokkel nyitunk es vegzunk        
    """
print felesleges
In [ ]:
print felesleges.strip()
In [ ]:
print felesleges.rstrip()
In [ ]:
print felesleges.lstrip()

Formázás format-al:

In [ ]:
matrix = [[1, -2, 30], [4, 3, 1], [-21, 23, 11]]
matstr = ""
for sor in matrix:
    for elem in sor:
        matstr += "{0:5d}".format(elem)
    matstr += "\n"
print matstr

Itt az elsõ szám a format paraméterének indexét jelzi, a kettõspont után vannak a formázási paraméterek. Elég a d-t ismerni.

Egy másik példa:

In [ ]:
for x in range(1,6):
    print '| {0:2d} | {1:3d} | {2:4d} |'.format(x, x*x, x*x*x)

Ami érdekes, hogy lehet névszerint is hivatkozni a formázottban lévõ elemekre, pl:

In [ ]:
print 'A középpont: ({x}, {y})'.format(x=3, y=5)

Reguláris kifejezések

Mintaillesztésrõl van szó. Szeretnénk olyan kifejezéseket gyártani, amik különbözõ stringekre igazak, követve valamilyen mintát. Például valid emailcímek.

Építõelemek:

. (pont) – bármely, kivéve az új sor karakter

^ (kalap jel) – a minta kezdete

$ (dollár jel) – a minta vége

| (pipa) – logikai elágazás, előtte vagy utána levő kifejezés

[] (szögletes zárójel) – karakter osztály, a szögletes zárójelek közötti karakterek valamelyikeire bármilyen sorrendben illeszkedik

() (kerek zárójel) – csoportosítás, a kerek zárójelek közötti karakterekre pontos sorrendben illeszkedik

[^ab@] (tagadás a karakter osztályban) – bármi, kivéve a, b vagy @

[0-6] (karakter osztály tartomány) – 0 és 6 közötti számokra illeszkedik

[a-fA-F] (karakter osztály tartomány) – ASCII kis és nagy betűkre illeszkedik a-tól f-ig

Ismétlések

* (csillag) – a minta 0 vagy többszöri ismétlése

+ (plusz) – a minta 1 vagy többszöri ismétlése

? (kérdőjel) – a minta 0 vagy egyszeri ismétlése

{3} (intervallum) – a mintában pontosan három karakter lehet

{3,} (intervallum) – a mintában legalább három vagy több karakter lehet

{,3} (intervallum) – a mintában legfeljebb három karakter lehet

{1,4} (intervallum) – a mintában legalább egy, legfeljebb négy karakter lehet

Általános karakter osztályok

\d decimális szám

\D nem decimális szám, minden más

\s szóköz karakter

\S bármely más karakter a szóközön kívül

\w bármely szó

\W bármi, ami nem szó

Escape-elés:

Itt is mint korábban, ha pl . (pont)-ot akarunk írni akkor fordított per jellel kell escape-elni:

\.

Példák

Néggyel osztható 2 jegyû számok:

[02468][048]|[13579][26]

Email (nem tökéletes):

\W+@\W+\.\W+

Bármely lebegõpontos szám:

^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$

Nagy betűkkel írt római számok:

M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})

Feladat

Hexadecimális színkód

3 darab hexadecimális szám egymás után pl:

A34DC8

Évszám

yyyy-mm-dd formátumban

Reguláris kifejezések pythonban

Elõször be kell töltenünk a re csomagot, mely tartalmazza a python regexp függvényeit:

In [ ]:
import re

Majd a findall függvénnyel megkereshetünk egy stringben minden elõfordulását a mintának:

In [ ]:
pattern = r'[0-9]+\s[a-z]+'
string = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print re.findall(pattern, string)

Nézzük még meg hogyan tudunk lecserélni megtalált részeket stringekben:

In [ ]:
mit = r'[0-9]+\s[a-z]+'
mire = r'12 majom'
miben = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print re.sub(mit, mire, miben)

Most kicsit bonyolultabban \1-el hivatkozok a () zárójelek közt megtalált részre:

In [ ]:
mit = r'[0-9]+\s([a-z]+)'
mire = r'12 \1'
miben = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print re.sub(mit, mire, miben)

Ha több dologra is szeretnénk hivatkozni, akkor \2 a második és így tovább:

In [ ]:
mit = r'([0-9]+)\s([a-z]+)'
mire = r'majdnem \1 \2'
miben = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print re.sub(mit, mire, miben)
In [ ]: