J’adore les regex, et d’ailleurs il faudra que je fasse une série d’articles sur le sujet, un peu comme le guide de la POO.
Mais dans un langage comme Python, il y a de nombreuses solutions à mettre en oeuvre avant d’utiliser les regex.
Pour vérifier si une chaîne est dans une autre, utilisez in
:
>>> 'a' in 'chat' True >>> 'a' in 'chien' False >>> 'a' in 'CHAT'.lower() # ignorer la casse True |
Pour savoir si un chaîne est au début ou à la fin, utilisez startswith()
et endswith()
:
>>> 'achat'.startswith('a') True >>> 'chat'.startswith('a') False >>> 'acheta'.endswith('a') True |
Pour savoir si la chaîne est d’un type particulier, utiliser les méthodes is*
:
>>> '555'.isdigit() True >>> ''.isdigit() False >>> '⑦'.isdigit() True >>> '444'.isdecimal() True >>> '444.55'.isdecimal() False >> '⑦'.isdecimal() False >>> '879fds'.isalpha() False >>> 'fsdqfsqd'.isalpha() True >>> 'fsdqfsqd'.islower() True >>> 'fsdqFFsqd'.islower() False >>> '879fds'.isalnum() True >>> '879fds-'.isalnum() False >>> ' \t\n'.isspace() True >>> ' \t\n fdsfd'.isspace() False |
Si vous voulez manipuler la chaîne pour en extraire une partie, utilisez split()
(ou rsplit()
, lsplit()
pour travailler sur la droite ou la gauche de la chaîne) :
>>> s = """Mais, vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation. Moi, si je devais résumer ma vie aujourd'hui avec vous, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face, je dirais, le miroir qui vous aide à avancer. Alors ce n'est pas mon cas, comme je le disais là, puisque moi au contraire, j'ai pu ; et je dis merci à la vie, je lui dis merci et je chante la vie, je danse la vie... Je ne suis qu'amour ! Et finalement, quand beaucoup de gens aujourd'hui me disent "Mais comment fais-tu pour avoir cette humanité ?", et bien je leur réponds très simplement, je leur dis que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction mécanique, mais demain, qui sait, peut-être simplement à me mettre au service de la communauté, à faire le don... le don de soi.""" >>> s.split() [u'Mais,', u'vous', u'savez,', u'moi', u'je', u'ne', u'crois', u'pas', u"qu'il", u'y', u'ait', u'de', u'bonne', u'ou', u'de', u'mauvaise', u'situation.', u'Moi,', u'si', u'je', u'devais', u'r\xe9sumer', u'ma', u'vie', u"aujourd'hui", u'avec', u'vous,', u'je', u'dirais', u'que', u"c'est", u"d'abord", u'des', u'rencontres,', u'des', u'gens', u'qui', u"m'ont", u'tendu', u'la', u'main,', u'peut-\xeatre', u'\xe0', u'un', u'moment', u'o\xf9', u'je', u'ne', u'pouvais', u'pas,', u'o\xf9', u"j'\xe9tais", u'seul', u'chez', u'moi.', u'Et', u"c'est", u'assez', u'curieux', u'de', u'se', u'dire', u'que', u'les', u'hasards,', u'les', u'rencontres', u'forgent', u'une', u'destin\xe9e...', u'Parce', u'que', u'quand', u'on', u'a', u'le', u'go\xfbt', u'de', u'la', u'chose,', u'quand', u'on', u'a', u'le', u'go\xfbt', u'de', u'la', u'chose', u'bien', u'faite,', u'le', u'beau', u'geste,', u'parfois', u'on', u'ne', u'trouve', u'pas', u"l'interlocuteur", u'en', u'face,', u'je', u'dirais,', u'le', u'miroir', u'qui', u'vous', u'aide', u'\xe0', u'avancer.', u'Alors', u'ce', u"n'est", u'pas', u'mon', u'cas,', u'comme', u'je', u'le', u'disais', u'l\xe0,', u'puisque', u'moi', u'au', u'contraire,', u"j'ai", u'pu', u';', u'et', u'je', u'dis', u'merci', u'\xe0', u'la', u'vie,', u'je', u'lui', u'dis', u'merci', u'et', u'je', u'chante', u'la', u'vie,', u'je', u'danse', u'la', u'vie...', u'Je', u'ne', u'suis', u"qu'amour", u'!', u'Et', u'finalement,', u'quand', u'beaucoup', u'de', u'gens', u"aujourd'hui", u'me', u'disent', u'"Mais', u'comment', u'fais-tu', u'pour', u'avoir', u'cette', u'humanit\xe9', u'?",', u'et', u'bien', u'je', u'leur', u'r\xe9ponds', u'tr\xe8s', u'simplement,', u'je', u'leur', u'dis', u'que', u"c'est", u'ce', u'go\xfbt', u'de', u"l'amour,", u'ce', u'go\xfbt', u'donc', u'qui', u"m'a", u'pouss\xe9', u"aujourd'hui", u'\xe0', u'entreprendre', u'une', u'construction', u'm\xe9canique,', u'mais', u'demain,', u'qui', u'sait,', u'peut-\xeatre', u'simplement', u'\xe0', u'me', u'mettre', u'au', u'service', u'de', u'la', u'communaut\xe9,', u'\xe0', u'faire', u'le', u'don...', u'le', u'don', u'de', u'soi.'] >>> s.split()[0] u'Mais,' >>> s.split()[5:7] [u'ne', u'crois'] >>> s.split(',') [u'Mais', u' vous savez', u" moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation. Moi", u" si je devais r\xe9sumer ma vie aujourd'hui avec vous", u" je dirais que c'est d'abord des rencontres", u" des gens qui m'ont tendu la main", u' peut-\xeatre \xe0 un moment o\xf9 je ne pouvais pas', u" o\xf9 j'\xe9tais seul chez moi. Et c'est assez curieux de se dire que les hasards", u' les rencontres forgent une destin\xe9e... Parce que quand on a le go\xfbt de la chose', u' quand on a le go\xfbt de la chose bien faite', u' le beau geste', u" parfois on ne trouve pas l'interlocuteur en face", u' je dirais', u" le miroir qui vous aide \xe0 avancer. Alors ce n'est pas mon cas", u' comme je le disais l\xe0', u' puisque moi au contraire', u" j'ai pu ; et je dis merci \xe0 la vie", u' je lui dis merci et je chante la vie', u" je danse la vie... Je ne suis qu'amour ! Et finalement", u' quand beaucoup de gens aujourd\'hui me disent "Mais comment fais-tu pour avoir cette humanit\xe9 ?"', u' et bien je leur r\xe9ponds tr\xe8s simplement', u" je leur dis que c'est ce go\xfbt de l'amour", u" ce go\xfbt donc qui m'a pouss\xe9 aujourd'hui \xe0 entreprendre une construction m\xe9canique", u' mais demain', u' qui sait', u' peut-\xeatre simplement \xe0 me mettre au service de la communaut\xe9', u' \xe0 faire le don... le don de soi.'] >>> s.split('.') [u"Mais, vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation", u" Moi, si je devais r\xe9sumer ma vie aujourd'hui avec vous, je dirais que c'est d'abord des rencontres, des gens qui m'ont tendu la main, peut-\xeatre \xe0 un moment o\xf9 je ne pouvais pas, o\xf9 j'\xe9tais seul chez moi", u" Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destin\xe9e", u'', u'', u" Parce que quand on a le go\xfbt de la chose, quand on a le go\xfbt de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face, je dirais, le miroir qui vous aide \xe0 avancer", u" Alors ce n'est pas mon cas, comme je le disais l\xe0, puisque moi au contraire, j'ai pu ; et je dis merci \xe0 la vie, je lui dis merci et je chante la vie, je danse la vie", u'', u'', u' Je ne suis qu\'amour ! Et finalement, quand beaucoup de gens aujourd\'hui me disent "Mais comment fais-tu pour avoir cette humanit\xe9 ?", et bien je leur r\xe9ponds tr\xe8s simplement, je leur dis que c\'est ce go\xfbt de l\'amour, ce go\xfbt donc qui m\'a pouss\xe9 aujourd\'hui \xe0 entreprendre une construction m\xe9canique, mais demain, qui sait, peut-\xeatre simplement \xe0 me mettre au service de la communaut\xe9, \xe0 faire le don', u'', u'', u' le don de soi', u''] |
Et n’oubliez pas que vous pouvez appeler join()
derrière.
Si vous devez altérer la chaîne, utilisez strip()
(et rstrip()
, lstrip()
) ou replace()
:
>>> "Les nouilles cuisent au jus de canne".replace('noui', 'coui').replace('cui', 'nui').replace('jus', 'cul').replace('canne', 'jeanne') u'Les couilles nuisent au cul de jeanne' >>> " . ".strip() u'.' >>> "=== . ======".strip("= ") u'.' |
En plus, les chaînes sont itérables, indexables et sliceables, donc :
>>> s = """And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord when I lay my vengeance upon you!""" >>> s[3:30:3] u' wltkdnp ' >>> s.split() [u'And', u'I', u'will', u'strike', u'down', u'upon', u'thee', u'with', u'great', u'vengeance', u'and', u'furious', u'anger', u'those', u'who', u'attempt', u'to', u'poison', u'and', u'destroy', u'my', u'brothers.', u'And', u'you', u'will', u'know', u'my', u'name', u'is', u'the', u'Lord', u'when', u'I', u'lay', u'my', u'vengeance', u'upon', u'you!'] >>> s[0] u'A' >>> ''.join([(l.upper() if i % 2 else l) for i, l in enumerate(s)]) u'ANd I wIlL StRiKe dOwN UpOn tHeE WiTh gReAt vEnGeAnCe aNd fUrIoUs aNgEr tHoSe wHo aTtEmPt tO PoIsOn aNd dEsTrOy mY BrOtHeRs. AnD YoU WiLl kNoW My nAmE Is tHe LOrD WhEn I lAy mY VeNgEaNcE UpOn yOu!' |
Bref, avant de sortir le bazooka, souvenez-vous que vous avez un arsenal déjà très approprié pour traiter les strings, dont les perfs seront en plus probablement meilleures.
( Musique des chiffres et des lettres ) Il y avait plus simple pour savoir si la chaine commence ou fini par un charactere :
Au début:
t="achat"
>>>if t[0]=="a":
... True
...
True
à la fin:
>>>if t[:-1]=="t":
... True
...
True
Ou plus fun :
>>> if t[0:3]=="ach":
... True
...
True
@pouete
C’est probablement plus une question de goût qu’autre chose, mais dans la PEP 8 ils recommandent plutôt les méthodes startswith() et endswith() :
Vi ça à l’air plus clean avec .startswith() et .endswith()
>>>> t=””
>>>> t[0]==”a”
Traceback (most recent call last):
File “”, line 1, in
IndexError: string index out of range
>>>> t.startswith(‘a’)
False
Y’a moyen de faire le malin aussi:
Le gros malin, même :
Mais du coup ça devient lourd, et du coup vive la PEP 8.
Très juste. Le gros gros malin:
J’imagine leur tete quand ils vont lire ces coms
WTF
Ai-je bien compris ce slice?
s[3:30:3]
Tu prend un caractère sur trois dans le slice [3:30]?
Si c’est ça, encore une découverte bien pratique!!
Merci les gars!
@les gros malins : je n’ai pas de tampon approprié pour ce genre de comment.
@syl : oui. Et on peut mettre un pas négatif aussi…
En tous cas, j’ai bien aimé l’altération de chaîne.
Y’a du potentiel….
C’est vrai qu’un tampon “Gros malin!” ou “Tu te crois drôle” pourrait bien servir, surtout pour les deux “zigotos” qui ont cherché à savoir qui avait la soluc’ la plus pourrie :)
Ouais, on mérite un tampon “C.B.S” pour Caïd de Bac à Sable
Je suis un peu déçu, je pensais que vous aviez fait un tampon “dynamique” (texte + couleur) – btw, je trouve l’idée du tampon juste géniale (et très drôle).
Nan, le blog c’est du low tech. Regarde le code HTML, tu vas voir, c’est pas triste.
Il y a une petite erreur : la fonction str.lsplit() n’existe pas.