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 [2]:
s1 = """Volt egyszer egy kiskutya.
Elment a vasarba.
Harmadik sor."""
In [3]:
print s1
Volt egyszer egy kiskutya.
Elment a vasarba.
Harmadik sor.

Ugyanez sima "-el:

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

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 [13]:
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 [16]:
matrix = [[1, -2, 30], [4, 3, 1], [-21, 23, 11]]
for sor in matrix:
    for elem in sor:
        print elem, "\t",
    print ""
1 	-2 	30 	
4 	3 	1 	
-21 	23 	11 	

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

Egyszerû string mûveletek

Részstring lekérés:

In [19]:
s = "Elsomasodikharmadik"
print s[:4]
print s[4:11]
print s[11:]
Elso
masodik
harmadik

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

In [20]:
s = "kiskutya"
print "5 " + s
5 kiskutya
In [21]:
s = "kiskutya"
mennyiseg = 5
print mennyiseg + s
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-ec9000e4cbb2> in <module>()
      1 s = "kiskutya"
      2 mennyiseg = 5
----> 3 print mennyiseg + s

TypeError: unsupported operand type(s) for +: 'int' and 'str'
In [23]:
s = "kiskutya"
mennyiseg = 5
print str(mennyiseg) + " " + s
5 kiskutya

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

Hasznos string metódusok

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

Nagybetûvel kezdés:

In [42]:
s.capitalize()
Out[42]:
'Egy kiskutya'

Csupa nagybetûvé tevés:

In [41]:
s.upper()
Out[41]:
'EGY KISKUTYA'

Csupa kisbetûvé tevés:

In [40]:
s.lower()
Out[40]:
'egy kiskutya'

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

In [39]:
s.isalpha()
Out[39]:
False

Formázás

Igazítás

In [44]:
s = "egy kiskutya"
In [45]:
s.center(30)
Out[45]:
'         egy kiskutya         '
In [46]:
s.rjust(30)
Out[46]:
'                  egy kiskutya'
In [47]:
s.ljust(30)
Out[47]:
'egy kiskutya                  '

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 [48]:
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
    1   -2   30
    4    3    1
  -21   23   11

Whitespace levágás

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

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

Formázás format-al:

In [58]:
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
    1   -2   30
    4    3    1
  -21   23   11

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 [60]:
for x in range(1,6):
    print '| {0:2d} | {1:3d} | {2:4d} |'.format(x, x*x, x*x*x)
|  1 |   1 |    1 |
|  2 |   4 |    8 |
|  3 |   9 |   27 |
|  4 |  16 |   64 |
|  5 |  25 |  125 |

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

In [61]:
print 'A középpont: ({x}, {y})'.format(x=3, y=5)
A középpont: (3, 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 [1]:
import re

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

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

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

In [4]:
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)
volt egyszer 12 majom, elmentek a 12 majom

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

In [6]:
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)
volt egyszer 12 kiskutya, elmentek a 12 varosba

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

In [7]:
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)
volt egyszer majdnem 25 kiskutya, elmentek a majdnem 13 varosba
In [ ]: