El Blog de Trespams

Blog personal sobre tecnologia, gestió de projectes i coses que se me passen pel cap

Tractament de cadenes en Python

El tractament de cadenes de Python és potser una d'aquelles coses que fan el llenguatge més potent. He fet feina amb altres llenguatges: C, C++, Forté, Pascal, Basic, ... i de lluny el tractament de cadenes de Python és el més clar, potent i a la vegada intuïtiu que m'he trobat, sols s'hi atraca un poc un llenguatge un tant esotèric anomenat icon al qual m'hi vaig aficionar ja fa molt de temps.

Anem a veure un parell d'exemples:


>>> a = "hola"
>>> b = ' món'
>>> print a+b
hola món

Com podem veure no import si feim servir cometes dobles o simples, i la concatenació de cadenes és simplement una suma. Tot i això hem de saber que les cadenes són també objectes i un dir ens dirà el que hi podem fer

>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__',
'__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__str__','capitalize', 'center', 'count', 'decode',
'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit',
'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition','rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

Per exeple un help(a.zfill) ens dirà què fa aquesta funció

Help on built-in function zfill:zfill(...) S.zfill(width) -> string
Pad a numeric string S with zeros on the left, to fill a field
of the specified width. The string S is never truncated.
(END)

És a dir, afegeix zeros a l'esquerra fins a l'emplada que volguem:

>>> a.zfill(10)
'000000hola'

Juguem un poc més amb les cadenes, què us imaginau que passarà si multiplicam una cadena per un sencer?

>> a*2
'holahola'

Bastant previsible, no? Python té aquestes coses, que pots preveure què passarà sense tenir-ne massa idea del llenguatge.

Suposem ara que volem agafar trossos d'una cadena, python tracta les cadenes com a matrius de caràcters i per tant és possible fer coses com aquestes:


>>> test = "hola món què 'passa' per aquí"
>>> print test[0]
'h'
>>> print test[0:4]
hola
>>> print test[:4]
hola
>>> print test[9:]
què 'passa' per aquí
>>> print test[9:22]
què 'passa'
>>> print test[9:-9]
què 'passa'

Fixem-nos en el darrer exemple, hem fet servir valors negatius per a referir-nos al final de la cadena.

També podem fer coeses com un recorregut pels caràcters de la cadena amb


>>> for char in test:
... if char == "'":
... print "cometa"
...
cometa
cometa


>>> [x for x in test if x > 'h']
['o', 'l', 'm', 'xc3', 'xb3', 'n', 'q', 'u', 'xc3', 'xa8',
'p', 's', 's', 'p', 'r', 'q', 'u', 'xc3', 'xad']

Però de llarg la meva preferida és la possibilitat de crear plantilles, a l'estil del printf de C o de les que darrerament ha incorporat Java 5, que ja era hora!
>>> missatge="hola %s, avui vindré a les %i"
>>> print missatge % ('Maria', 10)
hola Maria, avui vindré a les 10

O fins i tot fer servir diccionaris per això:

>>> missatge="hola %(nom)s, avui vindré a les %(hora)i"
>>> params = {'nom':'Catalina', 'hora':8}
>>> print missatge % params
hola Catalina, avui vindré a les 8

Me deix tota la part de funcions, expressions regulars i altres, això és sols per obrir boca, i potser ajudar a entendre a alguna gent del perquè el Python m'agrada tant.

Us deix algunes referències:

blog comments powered by Disqus