Bonjour,
la réponse est sûrement dans ce forum mais j'ose quand même la (re)poser.
Comment savoir si un texte donné est à peu près une adresse HTML ?
Bonjour,
la réponse est sûrement dans ce forum mais j'ose quand même la (re)poser.
Comment savoir si un texte donné est à peu près une adresse HTML ?
Ce que tu appelles adresse HTML est une URL. Elle peut avoir toutes sortes de formes correctes...
Le plus simple est d'utiliser la lib urlparse à voir (ici).
Il te suffit de vérifier que o.scheme vaut bien "http".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 >>> import urlparse >>> o = urlparse.urlparse('http://docs.python.org/library/urlparse.html') >>> o ParseResult(scheme='http', netloc='docs.python.org', path='/library/urlparse.html', params='', query='', fragment='')
Le souci c'est que cela marche sur une adresse complète. Quelque chose comme "www.google.com" n'est pas repéré.
Bonjour,
Comme j'en avais besoin il y a quelques mois, je me suis penché sur la vérification des adresses mail par regex. C'est ici:
http://python.jpvweb.com/mesrecettes...f_adresse_mail
Le problème, c'est que les normes permettent des syntaxes d'adresses mails très complexes, voire farfelues (ex: l'adresse !d!x\\y~z%abc@example.com est valide).
Comme je voulais seulement détecter des fautes de frappes après saisie au clavier, j'ai simplifié un peu, quitte à avoir quelques "faux non-conformes". Mais tu peux rajouter ce qui manque... à condition d'éplucher les normes (j'en donne les adresses).
Tyrtamos
Merci, je vais étudier cela dès que possible et je reviendrais à l'attaque ici.
Je déterre ce post car je me heurte au problème suivant :
J'obtiens FALSE et non TRUE comme espéré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # -*- coding: utf-8 -*- #! /usr/bin/env python import re # The following pattern commes from the following page : # http://python.jpvweb.com/mesrecettespython/verif_adresse_mail PATTERN_MAIL = re.compile(r""" ^ # beginning of string [a-zA-Z0-9_\-]+ #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere) (\.[a-zA-Z0-9_\-]+)* #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point @ #l'inevitable arrobas [a-zA-Z0-9_\-]+ #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere) (\.[a-zA-Z0-9_\-]+)* #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point (\.[a-zA-Z]{2,6}) #il y a forcement un dernier mot uniquement alphabetique, de longueur pouvant aller de 2 (ex: "fr") a 6 (ex: "museum") et precede par un seul point $ # end of string """) def isSimpleMail(stringToTest): return bool(PATTERN_MAIL.search(stringToTest)) print(str(isSimpleMail("mail@club.fr")))
Le problème vient de ma syntaxe multiligne car le code suivant fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 # -*- coding: utf-8 -*- #! /usr/bin/env python import re # The following pattern commes from the following page : # http://python.jpvweb.com/mesrecettespython/verif_adresse_mail PATTERN_MAIL = re.compile(r"^[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*@[a-zA-Z0-9_\-]+(\.[a-zA-Z0-9_\-]+)*(\.[a-zA-Z]{2,6})$") def isSimpleMail(stringToTest): return bool(PATTERN_MAIL.search(stringToTest)) print(str(isSimpleMail("mail@club.fr")))
Comment avoir une présentation multiligne afin de la commenter ?
Bonjour,
Je ne crois pas que ça puisse marcher en multiligne, et surtout pas avec une remarque (#...) à chaque ligne. Et dans la mesure où l'espace et l'antislash sont des caractères spéciaux dans les motifs, je ne vois pas comment faire.
Par contre, j'aime bien raisonner en multiligne pour construire et mettre au point des motifs complexes. Mais je passe en monoligne pour appliquer.
Tyrtamos
Bonsoir,
Il y a deux solutions:
- bien lire la doc:
http://python.developpez.com/cours/D...ns/verbose.php
La chose la plus importante à se rappeler lorsqu'on utilise des expressions régulières détaillées est qu'il faut passer un argument supplémentaire : re.VERBOSE est une constante définie dans le module re qui signale que le motif doit être traité comme une expresion régulière détaillée. Comme vous le voyez, ce motif comprend beaucoup d'espaces (qui sont tous ignorés) et plusieurs commentaires (qui sont tous ignorés). Une fois enlevés les espaces et les commentaires, on obtient exactement la même expression régulière que nous avons vu à la section précédente, mais elle est beaucoup plus lisible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # -*- coding: utf-8 -*- #! /usr/bin/env python import re PATTERN_MAIL = re.compile(r""" ^ # beginning of string [a-zA-Z0-9_\-]+ #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere) (\.[a-zA-Z0-9_\-]+)* #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point @ #l'inevitable arrobas [a-zA-Z0-9_\-]+ #il y a un premier mot compose de caracteres alphanumeriques et/ou le blanc souligne et/ou le tiret (mot eventuellement reduit a 1 seul caractere) (\.[a-zA-Z0-9_\-]+)* #il peut y avoir eventuellement d'autres mots de même composition, chacun precede d'un seul point (\.[a-zA-Z]{2,6}) #il y a forcement un dernier mot uniquement alphabetique, de longueur pouvant aller de 2 (ex: "fr") a 6 (ex: "museum") et precede par un seul point $ # end of string """,re.VERBOSE) def isSimpleMail(stringToTest): return bool(PATTERN_MAIL.search(stringToTest)) print(str(isSimpleMail("mail@club.fr")))
Il faut bien lire la doc de "Plonger dans Python" parce que
http://www.developpez.net/forums/d22...n/#post5006484
- faire comme je l’ai découvert un jour, en oubliant une vigule dans un tuple qui me servait de RE :
Cela repose sur le fait que des chaînes rencontrées les unes à la suite des autres par l’interpréteur sont automatiquement concaténées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ch = 'Louis' 'ian' "a H" 'igh' 'way 940' print chEt manifestement, quand ces chaînes distinctes sont placées entre parenthèses, elles peuvent être situées sur plusieurs lignes:Louisiana Highway 940
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ch = ('Waermund II (or Wær' "mund) was a m" 'edieval Bi' 'shop' "of Roches" "ter.\n" 'He was co' 'n''s''ec''rat' 'ed be' 'tween' ' ' '8' "45 and" ' 862. He died betwee' 'n 860 and 868.') print chWaermund II (or Wærmund) was a medieval Bishopof Rochester.
He was consecrated between 845 and 862. He died between 860 and 868.
Et donc ceci marche aussi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 # -*- coding: utf-8 -*- #! /usr/bin/env python import re REe = ('^' # beginning of string '[a-zA-Z0-9_\-]+' #il y a un premier mot compose de caracteres alphanumeriques #et/ou le blanc souligne et/ou le tiret (mot eventuellement #reduit a 1 seul caractere) '(\.[a-zA-Z0-9_\-]+)*' #il peut y avoir eventuellement d'autres mots #de même composition, chacun precede d'un seul point '@' #l'inevitable arrobase '[a-zA-Z0-9_\-]+' #il y a un premier mot compose de caracteres alphanumeriques #et/ou le blanc souligne et/ou le tiret (mot eventuellement #reduit a 1 seul caractere)' '(\.[a-zA-Z0-9_\-]+)*' #il peut y avoir eventuellement d'autres mots de même #composition, chacun precede d'un seul point '(\.[a-zA-Z]{2,6})' #il y a forcement un dernier mot uniquement alphabetique, #de longueur pouvant aller de 2 (ex: "fr") a 6 (ex: "museum") #et precede par un seul point '$' ) # end of string def isSimpleMail(stringToTest): return bool(PATTERN_MAIL.search(stringToTest)) print(str(isSimpleMail("mail@club.fr")))
L’avantage est qu’il n’y a pas besoin de s’embêter à savoir où il faut placer le re.VERBOSE, et que ça permet d’avoir des blancs dans la RE, ce qui n’est pas le cas dans une RE détaillée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 ch = """debut carabistouille 1567 UU palatino fin""" # NB ch vaut 'debut\ncarabistouille 1567 UU\npalatino\nfin' import re patver = re.compile(""" # saut de ligne .+?oui\w+ \d+ UU # uh uh uh .{2}latin.+ # zagalou """,re.VERBOSE) patesp = re.compile('\n' # saut de ligne '.+?oui\w+ \d+ UU' # uh uh uh '\n' # saut '.{2}latin.+' # zagalou '\n' ) # garggg) print patver.search(ch) print patesp.search(ch)None
<_sre.SRE_Match object at 0x010A2BB8>
Bravo eyquem, ça c'est intéressant: j'adopte!
Je préfère aussi la solution VERBOSE.
Tyrtamos
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager