• Aucun résultat trouvé

Exercice 1

nom = input ("Quel est votre nom ? ")

print ("Bonjour ",nom) ou

print ("Bonjour ", input ("Quel est votre nom ? : "))

En version 3.1 cela donne name = input("Quel est votre nom? ") print("Bonjour " + name + "!")

3. Écrire un programme qui demande à l'utilisateur la saisie de a et b et affiche la somme de a et de b. Solution

a = input ("Valeur de a : ") b = input ("Valeur de b : ") a= int (a)

b= int (b)

print ("Somme de a+b = ",a+b)

En version 3.1 cela pourrait être var_a = int(input("Donnez moi la valeur de a: ")) var_b = int(input("Donnez moi la valeur de b: "))

print("Voici le résultat de a + b : " ,var_a + var_b, "!")

4. Écrire un programme qui demande à l'utilisateur son année de naissance et qui affiche son âge. L'année courante sera mise dans une variable. Solution

# Ce script ne gère pas si l'anniversaire est passé ou non d'où le "environ"

annee_courante = 2016

print ("Quelle est votre année de naissance ?") reponse = raw_input()

print ("Vous avez environ", annee_courante- int(reponse),"ans")

Pour Python 3.1 # Ce script gère si l'anniversaire est passé from datetime import datetime

dn=input('Votre date de naissance ? (format jj/mm/aaaa) :') dn=dn.split('/');jn=int(dn[0]);mn=int(dn[1]);an=int(dn[2]) da=datetime.now()

if mn<da.month or (mn==da.month and jn<=da.day): age=da.year-an

else:

age=da.year-an-1

print('Vous avez',age,'ans.')

5. Écrire un programme qui demande à l'utilisateur les coordonnées de deux points dans le plan et qui calcule puis affiche la distance entre ces deux points

Exercice 3

Exercice 4

selon la formule : Solution importmath print ("xA?") xA = int(raw_input()) print ("yA?") yA = int(raw_input()) print ("xB?") xB = int(raw_input()) print ("yB?") yB = int(raw_input())

print ("distance entre A et B:", math.sqrt( (xA-xB)**2 + (yA-yB)**2)) En version 3.1

importmath

xA = int(input("Donnez moi Xa")) yA = int(input("Donnez moi Ya")) xB = int(input("Donnez moi Xb")) yB = int(input("Donnez moi Yb"))

distance = math.sqrt((xB - xA)**2 + (yB - yA)**2)

print("Bonjour, la distance qui sépare les deux points est de " + str(distance))

Regex

Les expressions régulières en Python nécessitent d'importer le module natif re[1], ou bien l'installation du module externe regex[2] si besoin des regex Unicode tels que \X.

Les expressions rationnelles peuvent être analysées et testées via un débogueur en ligne comme https://regex101.com/. Expressions rationnelles courantes

Caractère Type Explication

. Point n'importe quel caractère

[...] crochets classe de caractères : tous les caractères énumérés dans la classe [^...] crochets et

circonflexe classe complémentée : tous les caractères sauf ceux énumérés ^ circonflexe marque le début de la chaine, la ligne...

$ dollar marque la fin d'une chaine, ligne...

| barre verticale alternative - ou reconnaît l'un ou l'autre

(...) parenthèses groupe de capture : utilisée pour limiter la portée d'un masque ou de l'alternative

* astérisque 0, 1 ou plusieurs occurrences

+ le plus 1 ou plusieurs occurrences

? interrogation 0 ou 1 occurrence

{...} accolades comptage : détermine un nombre de caractères remplissant les critères qu'il suit (ex :a{2} deux occurrences de "a", a{1, 10} entre une et dix)

Remarques :

Les caractères de débuts et fin de chaines (^ et $) ne fonctionnent pas dans [] où ils ont un autre rôle.

Les opérateurs * et + sont toujours avides, pour qu'ils laissent la priorité il faut leur apposer un ? à leur suite[3]. Classes de caractères POSIX[4]

Classe Signification

[[:alpha:]] n'importe quelle lettre [[:digit:]] n'importe quel chiffre [[:xdigit:]] caractères hexadécimaux [[:alnum:]] n'importe quelle lettre ou chiffre [[:space:]] n'importe quel espace blanc [[:punct:]] n'importe quel signe de ponctuation [[:lower:]] n'importe quelle lettre en minuscule [[:upper:]] n'importe quelle lettre capitale [[:blank:]] espace ou tabulation

[[:graph:]] caractères affichables et imprimables [[:cntrl:]] caractères d'échappement

[[:print:]] caractères imprimables exceptés ceux de contrôle

Syntaxe

Expressions rationnelles Unicode[5]

Expression Signification

\A Début de chaine

\b Caractère de début ou fin de mot

\d Chiffre

\D Non chiffre

\n Fin de ligne

\s Caractères espace

\S Non caractères espace

\t Tabulation

\w Caractère alphanumérique : lettre, chiffre ou underscore \W Caractère qui n'est pas lettre, chiffre ou underscore

\X Caractère Unicode

\z Fin de chaine

Constructeurs spéciaux : Ces fonctions précèdent l'expression à laquelle elles s'appliquent, et le tout doit être placé entre parenthèses.

?: : groupe non capturant. Ignorer le groupe de capture lors de la numérotation des backreferences. Exemple : ((?:sous-chaine_non_renvoyée|autre).).

?> : groupe non capturant indépendant. ?<= : positive lookbehind.

?<! : negative lookbehind. ?= : positive lookahead.

?! : negative lookahead. Exclusion d'une chaine. Il faut toujours la faire suivre d'un point. Exemples : ((?!sous-chaine_exclue).)

<(?!body).*> : pour avoir toutes les balises HTML sauf "body".

début((?!\mot_exclu).)*fin[6] : pour rechercher tout ce qui ne contient pas un mot entre deux autres. \1 : résultat du premier groupe de capture dans les remplacements (\2 correspond au deuxième, etc.).

compile() renvoie None si l'expression rationnelle n'est pas trouvée dans la chaine. search() renvoie la position des chaines recherchées.

#!/usr/bin/env python importre

chaine = "Test regex Python pour Wikibooks francophone." if re.compile('Wikibooks').search(chaine):

print "Position du mot Wikibooks : "

print re.search(u'Wikibooks', chaine).start()

# Affiche "23"

printre.search(u'Wikibooks', chaine).end()

# Affiche "32"

Pour voir le pattern compilé : re.compile('Wikibooks').pattern findall() trouve toutes les correspondances dans un tableau. finditer() trouve toutes les correspondances dans un itérateur.

#!/usr/bin/env python

# Affiche tous les mots qui commencent par "Wiki" importre

chaine = "Wikilivre regex Python pour Wikibooks francophone." print(re.findall(r"Wiki\w+", chaine))

# Affiche ['Wikilivre', 'Wikibooks']

Les parenthèses imbriquées permettent d'indiquer des mots facultatifs au sein d'un groupe de capture. Ex :

#!/usr/bin/env python

Recherche

# Trouve à un mot prêt importre

chaine = "Wikilivre regex Python pour Wikibooks francophone."

regex = ur'(Python pour Wikibooks)' printre.search(regex, chaine).start() # 16

regex = ur'(Python (pour )*Wikibooks)' printre.search(regex, chaine).start() # 16

regex = ur'(Python pour (les )*Wikibooks)' printre.search(regex, chaine).start() # 16

Pour accéder aux résultats des groupes de capture, utiliser group() en partant de 1 (0 étant le match du pattern entier) :

#!/usr/bin/env python importre

chaine = "Wikilivre regex Python pour Wikibooks francophone."

s = re.search(ur'(Wiki[a-z]*).*(Wiki[a-z]*)', chaine) if s:

print s.group(0)

# Affiche 'Wikilivre regex Python pour Wikibooks' print s.group(1)

# Affiche 'Wikilivre' print s.group(2)

# Affiche 'Wikibooks'

Le comportement de certaines expressions peut être reconfiguré en ajoutant un "flag" en paramètre des méthodes[7].

Ignore la casse. Ainsi dans l'exemple précédent nous pouvions aussi faire :

s = re.search(ur'(wiki[a-z]*).*(wiki[a-z]*)', chaine, re.IGNORECASE)

Par défaut, les caractères "^" et "$" désignent le début et la fin de tout le texte. Or, en mode multiligne, un "^" en début de re.search() considérera le début de chaque ligne, et "$" leurs fins.

Pour partir uniquement du début de la chaine globale, il faut alors ne plus utiliser "re.search()" mais "re.match()"[8].

Par défaut, .* et .+ s'arrêtent aux retours chariot (\n). Pour qu'ils englobent ces retours à la ligne, il faut appeler re.DOTALL. Exemple : if re.search(regex, text, re.MULTILINE| re.DOTALL):

#!/usr/bin/env python

# Remplace tous les espaces par des underscores importre

chaine = "Test regex Python pour Wikibooks francophone."

chaineTriee = re.sub(r' ', "_", chaine) printchaineTriee

# Affiche "Test_regex_Python_pour_Wikibooks_francophone."

Pour remplacer certains éléments en conservant ceux placés entre parenthèses, il faut les désigner par \1, \2, \3...

group()

Flags

re.IGNORECASE re.MULTILINE re.DOTALL

Remplacement

#!/usr/bin/env python

# Ajoute des guillemets à tous les mots suivent "livre" importre

chaine = "Test regex Python pour le livre Python de Wikibooks francophone."

chaineTriee = re.sub(r'(.*)livre (\w+)(.*)', r'\1livre "\2"\3', chaine) printchaineTriee

# Affiche "Test regex Python pour le livre "Python" de Wikibooks francophone."

Remarque : si les paramètres (\1, \2...) sont remplacés par le symbole �, vérifier que la chaine regex est bien encodée avec r.

Attention !

Les différents contenus d'un même groupe de capture sont remplacés par le premier \1. Pour éviter cela, il faut les traiter un par un avec "finditer()".

Exemple : remplacement de la balise "font color=" par "span style=font-size:".

text = ur'<font color=green>Vert</font> / <font color=red>rouge</font>'

regex = ur'<font color=([^>]*)>'

pattern = re.compile(regex, re.UNICODE) for matchin pattern.finditer(text):

printu'Remplacement de ' + match.group(0) + u' par <span style="font-color:' + match.group(1) + u'">'

text = text.replace(match.group(0), u'<span style="font-color:' + match.group(1) + u'">') text = text.replace('</font>', u'</span>')

raw_input(text)

Récupérer le premier modèle 1 wiki non imbriquée dans un autre modèle : page =u'{{Modèle2|Paramètre2, {{Modèle1|Paramètre3}} }}, {{Modèle1|Paramètre4}}'

regex = ur'({{(.*?)}}|.)*[^}]*'

raw_input(re.sub(regex, ur'\2', page).encode(config.console_encoding, 'replace')) Pour indiquer un nombre précis d'occurrences, utiliser "{nombre}". Ex :

#!/usr/bin/env python importre

chaine = 'w.1, ww.2, www.3, wwww.4'

printre.sub(ur' w{3}\.', ' http://www.', chaine)

w.1, ww.2, http://www.3, wwww.4 Idem pour une plage de nombres : {min,max}.

Attention !

Quand on injecte une variable dans un pattern, il faut échapper ses caractères interprétables avec re.escape(). https://docs.python.org/2/howto/regex.html 1. https://pypi.org/project/regex/ 2. https://docstore.mik.ua/orelly/webprog/pcook/ch13_05.htm 3. https://www.regular-expressions.info/posixbrackets.html 4. http://www.regular-expressions.info/unicode.html 5. https://www.regextester.com/15 6. https://docs.python.org/2/library/re.html#module-contents 7. https://docs.python.org/2/library/re.html#search-vs-match 8.

Exemples de formules

Références

Programmation orientée objet pour les non-programmeurs