Expressions régulières

Résolu/Fermé
jlouis45170 - Modifié le 29 janv. 2019 à 18:06
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 31 janv. 2019 à 19:25
Bonjour,
J'ai un problème avec les expressions régulières...
Je recherche dans une chaîne de caractères placée dans une variable (ligne) si je trouve "http" ainsi qu' une suite de caractères alpha suivi d'un point suivant de "fr/"
Voila mon bout de code (début) qui ne fonctionne pas (la regex est fausse mais même avec ca je en trouve pas de http dans mes lignes lues.

fic_entree = open("EXPORT.CSV","r",errors='ignore')
ligne_lue = fic_entree.readline()
regex = r"(http)"
for ligne_lue in fic_entree:
    ligne_sor = ""
    if re.match(regex,ligne_lue) is not None:
        nbr_lue += 1


Si quelque'un(e) peut m'aider merci par avance.
JLouis


Configuration: Windows / Chrome 71.0.3578.98

3 réponses

Bonjour, il y a une petite subtilité à savoir avec re.match.

>>> import re
>>> re.match('http', 'ccm : https://www.commentcamarche.net/')
>>> re.match('http', 'https://www.commentcamarche.net/')
<_sre.SRE_Match object; span=(0, 4), match='http'>
>>> re.search('http', 'ccm : https://www.commentcamarche.net/')
<_sre.SRE_Match object; span=(6, 10), match='http'>
>>> help(re.match)


Help on function match in module re:

match(pattern, string, flags=0)
Try to apply the pattern at the start of the string, returning
a match object, or None if no match was found.
(END)


Ce qui signifie que
re.match(expr) == re.search(^expr)
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 31 janv. 2019 à 07:24
Bonjour
est ce que ceci te conviendrait

http://regexstorm.net/tester?p=http.%2B%5C.fr%2F&i=http%3A%2F%2Ftoto.fr%2F%0D%0Acoucouhttp%3A%2F%2Ftoto.fr%2Fmachin%0D%0Ahttp%3A%2F%2Ftoto.fr%0D%0Ahttptoto.fr%2F%0D%0A

Ou faut il s'assurer
  • qu'après le http il y ait "://"
  • que http soit en début de ligne


Dans ton code tu travaille ligne par ligne, mais comme le montre l'exemple, il est possible de traiter le texte entier


0
jlouis-01_45170 Messages postés 6 Date d'inscription mardi 29 janvier 2019 Statut Membre Dernière intervention 3 février 2019
31 janv. 2019 à 10:22
Je te remercie MAIS je débute en python et j'ai besoin de récupérer uniquement les lignes qui contiennent http et une extension de domaine comme .fr.
Voila ou j'en suis et ca ne fonctionne pas..... je craque. ce que je veux c'est récupérer dans ligne_sr uniquement les lignes qui contiennent le pattern.
merci de ton aide.

fic_entree = open("EXPORT.CSV","r",errors='ignore')
ligne_lue = fic_entree.readline()
regex = r"(http.+\.fr/)"
for ligne_lue in fic_entree:
ligne_sor = ""
ligne_sor = re.match(regex,ligne_lue)
if ligne_sor != "":
nbr_lue += 1
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
31 janv. 2019 à 12:50
besoin de récupérer uniquement les lignes qui contiennent http et une extension de domaine comme .fr.


Une regex c’est très précis. Et ta description ne l’est pas.
De plus, je t’ai posé 2 questions auxquelles tu n’as pas répondues.
0
jlouis-01_45170 Messages postés 6 Date d'inscription mardi 29 janvier 2019 Statut Membre Dernière intervention 3 février 2019
31 janv. 2019 à 13:49
pour tes 2 questions, je dirais peu importe. Imaginons que je recherche toutes les lignes qui contiennent http et .fr c'est juste pour me permettre de démarrer sur les regex en python
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
31 janv. 2019 à 15:54
0
jlouis-01_45170 Messages postés 6 Date d'inscription mardi 29 janvier 2019 Statut Membre Dernière intervention 3 février 2019
31 janv. 2019 à 16:59
Merci encore mais ca ne fonctionne pas avec le code ci-dessous, toutes les lignes sont sélectionnées alors qu'elles ne devraient pas l'être... grrrrr

fic_entree = open("EXPORT.CSV","r",errors='ignore')
ligne_lue = fic_entree.readline()
regex = "(^|\n).*http.+\.fr.*(\r|$)"
for ligne_lue in fic_entree:
ligne_sor = ""
ligne_sor = re.match(regex,ligne_lue)
if ligne_sor != "":
nbr_lue += 1
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
31 janv. 2019 à 18:26
Pour poster un code, merci d'utiliser les balises de code, explications ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Entre autre cela conserve l'indentation, qui est essentielle ben Python.

D'autre part, je ne code pas en Python, donc je ne sais pas te dire en détails ce qui ne va pas, cependant, il semble que tu continues à traiter ligne par ligne, ce qui est inutile. Sur le site exemple y'a pas de boucle, et pourtant il y a plusieurs lignes sélectionnées.
0
jlouis-01_45170 Messages postés 6 Date d'inscription mardi 29 janvier 2019 Statut Membre Dernière intervention 3 février 2019
31 janv. 2019 à 18:56
ok c'est bon grace à toi j'ai trouvé je vais continuer à apprendre
merci pour tout
bien à toi
jean-Louis
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
31 janv. 2019 à 19:25
de rien, pense à marquer le sujet résolu avec la roue dentée tout en haut.
0