Ismétlésül néhány hasznos speciális karakter:
uj_sor = "\n" #
horizontalis_tab = "\t" # vizszintes tabulator
rep = "\\" # forditott per
egyes_idezojel = "\'" # '
kettes_idezojel = "\"" # "
Néhány művelet:
a = "That's"
b = "fine"
| Operator | Description | Input | Output |
|---|---|---|---|
| + | Concatenation | a + b | That'sfine |
| * | Repetition | 2 * b | finefine |
| [] | Slice | a[1] | h |
| [:] | Range Slice | a[1:4] | hat |
| in | Membership | 'a' in a | True |
| not in | Membership | 'a' not in b | True |
| r/R | Raw String suppresses escape chars | r'\n' | \n |
| % | Format: %s %d %o (octal) %x (hex) %f %e %E %g %G |
x = 12.345
y = 12.3e10
print("f: %f, e: %e, g: %g" % (x, x, x) )
print("f: %f, e: %e, g: %g" % (y, y, y) )
hi = "how ARE you"
| Method | Description | Input | Output |
|---|---|---|---|
| .capitalize() | first letter into upper case | hi.capitalize() | How are you |
| .lower() | lower case | hi.lower() | how are you |
| .upper() | upper case | hi.upper() | HOW ARE YOU |
| .title() | every word capitalized | hi.title() | How Are You |
s = "hol KIS-, hol NAGYbetűk"
Az első szó kezdődjön nagybetűvel, az összes többi betű legyen kicsi:
s.capitalize()
Csupa nagybetűssé tevés:
s.upper()
Csupa kisbetűssé tevés:
s.lower()
| Method | Boolean value |
|---|---|
| .isalnum() | alphanumeric characters (no symbols)? |
| .isalpha() | alphabetic characters (no symbols)? |
| .islower() | lower case? |
| .isnumeric() | numeric characters? |
| .isspace() | whitespace characters? |
| .istitle() | is in title case? |
| .isupper() | upper case? |
Csak az ábécé betűit tartalmazza-e (emlékeztető: a szóköz nem az ábécé betűje):
"a b".isalpha()
alnum = "23 apples"
num = "-1234"
title = "Big Apple"
print(alnum.isalnum(), num.isnumeric(), title.istitle())
alnum = "23apples"
num = "1234"
white = " \t \n\n "
print(alnum.isalnum(), num.isnumeric(), white.isspace())
Ha egy részsztring pontos helyét is tudni akarjuk:
'betű' in s
s.find('betű')
hi = "how ARE you"
seq = ['h', 'o', 'w'] #OR seq = 'h', 'o', 'w'
wh = "\t this \n "
| Method | Description | Input | Output |
|---|---|---|---|
| .join() | concatenates with separator string | " < ".join(seq) | h < o < w |
| .lstrip() | removes leading whitespaces | wh.lstrip() | "this \n " |
| .rstrip() | removes trailing whitespaces | wh.rstrip() | "\t this" |
| .strip() | performs lstrip() and rstrip() | wh.strip() | "this" |
| .replace(old, new [, m]) | replaces old with new at most m times | hi.replace("o", "O") | hOw ARE yOu |
| .split(s[,m]) | splits at s max m times, returns list | hi.split() | [ "how", "ARE", "you" ] |
Karakterlánc felbontása megadott szeparátor karakter segítségével (ha a szeparátor nincs megadva, nem látható (white spaces) karaktereknél vág szét). Eredményül visszakapjuk a részsztringek listáját:
wh = 'tab\túj sor\nszóköz'
wh.split()
s.split()
s = "elso masodik\tharmadik\nnegyedik" # szokozokkel szavakra vagjuk
s.split(" ")
s = "elso masodik, harmadik, negyedik"
s.split(", ") # itt egy vesszo es egy szokoz is van!
Nem látható (whitespace) karakterek törlése a karakterlánc elejéről és végéről, vagy megadott karakterek törlése az elejéről és végéről:
s = ' \t szokozok \t \n\n '
s.strip()
s = "...vesszővel kezdődik, ponttal vegződik vagy fordítva,"
print(s.strip(".,")) # mindket vegerol
print(s.rstrip(".,")) # csak jobbrol torol
print(s.lstrip(".,")) # csak balrol torol
s = "hol vagyok"
print('0123456789'*3)
print(s.center(30))
print(s.rjust(30))
print(s.ljust(30))
A paraméterként átadott érték szabályozza a létrejött string hosszát.
Így egy táblázat (tömb) kiírása jobban kezelhető:
tablazat = [["Elso sor", -2, -310],
["Masodik sor", 3, 1], ["Harmadik sor", -321, 11]]
karakteres_tablazat = ""
for sor in tablazat:
karakteres_tablazat += sor[0].ljust(13)
for i in range(1, len(sor)):
karakteres_tablazat += str(sor[i]).rjust(7)
karakteres_tablazat += "\n"
print(karakteres_tablazat)
format metódussal¶Itt az objektum a formátumot leíró karakterlánc és a format metódus argumentumai a behelyettesítendő értékek. A formátumban { és } között először a format argumentumának indexe szerepel, majd opcionálisan : után a formátum leírása:
'{0}-{1}-{2} {0}, {1}, {2}, {0}{0}{0}'.format('X', 'Y', 'Z')
| Jel | Jelentés |
|---|---|
| d | Decimális (ezt kell tudni) |
| b | Bináris |
| o | Oktális |
| x, X | hex, HEX formátum |
| f, F | (float) lebegőpontos szám |
| e, E | (exp) lebegőpontos szám exponenciális alakban |
| < | balra igazít |
| > | jobbra igazít |
| ^ | középre igazít |
| c^ | középre igazít és körülötte az opcionális 'c' karakterrel kitölt |
print("01234 01234 01234 0123456789")
print('{0:5} {1:5d} {2:_>5} {3:_^10}'.format('0123', 1234, '|', 'kozepe'))
"int {0:d}, hex {0:x} {0:X}, oct {0:o}, bin {0:0>8b}".format(42)
"{0}, {0:e}, {0:f}, {0:10.4f}, {0:15.1f}".format(-12.345)
'A középpont: ({x:5}, {y:f})'.format(y=5, x=3)
x1 = 3; y1 = 4
print('A középpont: ({x}, {y})'.format(x=x1, y=y1))
formazott_tablazat = ""
for sor in tablazat:
formazott_tablazat += "{0:<13}".format(sor[0])
for i in range(1, len(sor)):
formazott_tablazat += "{0:>7d}".format(sor[i])
formazott_tablazat += "\n"
print(formazott_tablazat)
Adott jellemzőkkel rendelkező karakterláncok felismerése a cél (pl. érvényes email-cím, dátum, római szám, IP-cím,...)
Olvasnivalók:
Vannak online tesztoldalak, ahol programozás nélkül lehet próbálgatni a reguláris kifejezéseket: https://regex101.com/#python, https://extendsclass.com/regex-tester.html#python, https://www.regextester.com/, https://pythex.org/ (itt van puska is).
A reguláris kifejezésekben használt metakarakterek: . ^ $ * + ? { } [ ] ( ) \ |
| Jel | Jelentése (mire illeszkedik) | Példa | Illeszkedik |
|---|---|---|---|
| . | bármely karakterre illeszkedik (kivéve új sor) | "t.t." | tatu, tütü |
| ^ | a minta elejére illeszkedik | "^Mélységes mély" | |
| $ | a minta végére illeszkedik | "és bízva bízzál.\$" | |
| | | logikai vagy a környező RE-ekre | "Informati(cs|ka)" | Informatics, Informatika |
| [] | a felsorolt karakterek bármelyikére illeszkedik | [xq] | x, q |
| [^chars] | bármi, kivéve a felsoroltak | [^xq] | a, b, c,... |
| [a-z] | tartomány | "[0-9a-fA-F]" | bármely hexa jegy |
| () | hivatkozható csoportosítás | ||
| ? | előző RE 0 vagy egyszeri ismétlése | "colou?r" | color, colour |
| * | a megelőző RE 0 vagy többszöri ismétlése | "woo*w" | wow, woooooow |
| + | a megelőző RE 1 vagy többszöri ismétlése | "wo+w" | wow, woooooow |
| *? | a * lusta változata | ||
| +? | a + mohó változata | ||
| {n} | az előző RE pontosan n-szer | "al{2}e{2}" | allee |
| {n,} | az előző RE legalább n-szer | "wo{3,}w" | wooow, woooow |
| {,n} | az előző RE legföljebb n-szer | ||
| {n,m} | legalább n-szer, legföljebb m-szer | ||
| \ | a spec. karakterek escape-elésére |
| Általános karakterosztá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ókarakter: alfanumerikus karakter vagy aláhúzás |
| \W | bármi, ami nem szókarakter (nem alfanumerikus és nem aláhúzás) |
| \b | szóhatár |
Először be kell töltenünk a re csomagot, mely tartalmazza a python regexp függvényeit:
import re
A re modul néhány függvénye:
| Függvény | Leírás |
|---|---|
| findall(p, s) | a p minta összes előfordulása az s sztringben |
| search(p, s) | visszaad egy „match object”-et ha p illeszkedik s egy részére |
| split(p, s) | elvágja p minden illeszkedésénél az s sztringet, listát ad vissza |
| sub(p, n, s[, m]) | helyettesíti p-t n-re az s-ben m-szer |
| finditer(p, s) | "match object"-ek iterálható objektuma |
A „match object” megadja, hogy a minta hol illeszkedik és mire. Ezt az infot a .span() és a .group() metódus adja vissza.
A karakterláncokban az eszképelt, azaz a \ jellel kezdődő karakterek (\n, \t, \) és a reguláris kifejezések \ jellel kezdődő parancsaiból adódó bizonytalanságok elkerülésére helyesebb, ha a reguláris kifejezések karakterláncait nyers (raw) formában adjuk meg, vagy minden karaktert eszképeljünk. Nyers formában tehát a \ repjelet jelent! Nyers karakterláncot az elé írt r betűvel jelöljük.
nyers = r"aa\txx\s"
nem_nyers = "aa\txx\s"
eszkepelt = "aa\txx\\s"
print("Nyers: " + nyers)
print("Nem nyers: " + nem_nyers)
print("Eszképelt: " + eszkepelt)
s = "confirmation"
p = ".i"
print(re.findall(p, s))
print(re.search(p, s))
x = re.search(p, s)
print(x.span())
print(x.group())
print(re.split(p, s))
x = re.finditer(p, s)
for y in x:
print(y.group(), y.span())
s = "Hú, de szép"
p = "([úé])"
print(re.sub(p, r"\1\1\1\1", s))
s = "This 'string' has two 'quoted' words"
p1 = "'.*'" # mohó, greedy
p2 = "'.*?'" # lusta, lazy
print(re.findall(p1, s), " --> greedy")
print(re.findall(p2, s), " --> lazy")