IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

probleme de regex


Sujet :

Réseau/Web Python

  1. #1
    Membre actif
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Points : 299
    Points
    299
    Par défaut probleme de regex
    salut a tous,

    j'ai un petit soucis avec les regex. J'ai sous les yeux e bouquin de Tark Ziadé mais impossible de résoudre mon probleme.
    J'ai un fichier html contenenant une ligne:
    <td colspan=3 class="individualName">Un nom quelconque</td>

    Mon but serai de recuperer juste les caracteres "un nom quelconque".
    Vous savez faire?Moi non les regex n'ont jamais été mon fort


    Vous avez trouvé votre bonheur? Alors hop ca aidera tout le monde !

  2. #2
    Membre expérimenté Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Points : 1 728
    Points
    1 728
    Par défaut
    Salut,

    les regex n'ont jamais été mon fort
    Pareil pour moi, je m'y perd facilement!!

    Je peux juste te conseiller Kodos pour tester tes regex.

    Bon courage
    "Etre conscient de la difficulté permet de l'éviter.."
    Lao-Tseu.

  3. #3
    Membre actif
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Points : 299
    Points
    299
    Par défaut
    Citation Envoyé par pacificator Voir le message
    Salut,

    Pareil pour moi, je m'y perd facilement!!

    Je peux juste te conseiller Kodos pour tester tes regex.

    Bon courage
    ha oué je connais ca, l'outil est présenté dans le livre de Tarek.
    Je vais perseverer et on verra

    merci


    Vous avez trouvé votre bonheur? Alors hop ca aidera tout le monde !

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Il faut bien distinguer
    - la manière dont on détecte les lignes dans lesquelles il y a un 'Un nom quelconque' à récupérer
    - et la manière dont on fait l'extraction.

    Qu'est ce qui te pose problème: la détection ou l'extraction ?

    Pour ces deux points, on est obligé d'en savoir un minimum sur ce qui entoure 'Un nom quelconque' dans sa ligne.
    Pour être précis sur ces deux points il faudrait donc en dire plus sur la structure des lignes recherchées.




    Pour la détection, une regex ne se justifie que si les caractères qui entourent 'Un nom quelconque' ont une variabilité.
    S'il sont fixes, le problème est assez facile et ne nécessite pas de regex.

    Par exemple si 'Un nom quelconque' est toujours
    précédé de
    <td colspan=3 class="individualName">
    et suivi de
    </td>
    dans une position quelconque au sein de la ligne (c'est à dire qu'il peut y avoir des caractères en nombre quelconque devant <td colspan=3 class="individualName"> )
    on pourra faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if '<td colspan=3 class="individualName">' in ligne and '</td>' in ligne:
      recup = ligne.partition('individualName">')[2].partition('</td>')[0]



    Si les caractères qui entourent 'Un nom quelconque' ont une certaine variabilite, on peut se débrouiller avec end() et start() sur un MatchObject

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ligne = '<td colspan=3 class="individualName">Un nom quelconque</td>'
    bla = re.compile('<td c[a-z]+span=\d+ class="[a-z]+Name">?')
    if bla.match(ligne):
        m = bla.match(ligne)
        fin = m.end()
        recup = ligne[fin:].partition('</td')[0]

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Si tu veux repérer ce qui est entre les chaînes exactes <td colspan=3 class="individualName"> et </td>, tu peux faire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ex = re.compile('<td colspan=3 class="individualName">(.+?)</td>')
    #[...] (si le code de recherche est dans une boucle,
    # il peut être judicieux de précompiler l'expression)
    m = ex.search(ligne)
    if m is not None:
        recup = m.group(1)

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut Je ne suis pas d'accord
    D'une part, dans le principe de traitement, je ne trouve pas que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    x = re.compile('<td colspan=3 class="individualName">(.+?)</td>')
    for ligne in f:
        m = x.search(ligne)
        if m is not None:
            recup = m.group(1)
            print 'recup =',recup
    dans lequel il y a
    - exécution de compile
    - exécution de search
    - test sur le MatchObject
    - exécution de group

    soit plus simple que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ligne in f:
        if '<td colspan=3 class="individualName">' in ligne and '</td>' in ligne:
             recup = ligne.partition('individualName">')[2].partition('</td>')[0]
             print 'recup =',recup
    dans lequel il n'y a que partition() qui découpe deux fois.



    Certes, je suis admiratif des possibilités du module re. Je n'ai qu'une très vague sur la manière dont peut fonctionner ce grand engin. Il m'apparait comme un vaisseau spatial sophistiqué bourré de fonctions dans ses soutes, qui permet d'explorer des contrées incroyablement accidentées.

    Mais étant donné ces possibilités des fonctions re, on peut justement penser qu'elles "brassent" plus que de simples méthodes de chaines, et qu'à faire les choses de façon plus poussée, elle perdent en efficacité, non pas de résultat puisqu'elles peuvent faire plus que des méthodes de chaines, mais de rapidité.

    C'est ce que j'ai testé avec une mesure sommaire de temps d'exécution. J'ai placé la ligne <td colspan=3 class="individualName">Tour Eiffel</td> trois lignes avant la fin d'un fichier 'gros' de 16,2 MB et de 358 459 lignes et j'ai lancé le code suivant dessus



    Les temps moyens pour trouver la ligne, calculé par itération à 40 tours, ont été:

    avec regex: 2,9194 secondes
    avec partition(): 1,1280 secondes


    Temps divisé par 2,6 avec partition() par rapport à l'utilisation d'une regex,
    61 % de temps en moins !

    Cela me conforte dans mon idée: inutile de prendre un vaisseau spatial pour traverser une rue.

  7. #7
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut pardon j'ai oublié le code
    c'est pas super important, mais bon....

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    import re
    from time import clock
     
    bla = re.compile('<td colspan=3 class="individualName">(.+?)</td>')
     
    nbtours = 40
     
    li1 = []
    somme = 0
    for fois in range(nbtours):
        t0 = clock()
        f = open('riscuanov1','r')
        for ligne in f:
            m = bla.search(ligne)
            if m is not None:
                recup = m.group(1)
                li1.append(recup)
        f.close()
        somme = somme + clock()-t0
        print clock()-t0
     
    print li1
    print 'nombre de fois =',nbtours,'   temps moyen =',somme/nbtours
     
     
    li2 = []
    somme = 0
    for fois in range(nbtours):
        t0 = clock()
        f = open('riscuanov1','r')
        for ligne in f:
            if '<td colspan=3 class="individualName">' in ligne and '</td>' in ligne:
                recup = ligne.partition('individualName">')[2].partition('</td>')[0]
                li2.append(recup)
        f.close()
        somme = somme + clock()-t0
        print clock()-t0
     
    print li2
    print 'nombre de fois =',nbtours,'   temps moyen =',somme/nbtours

Discussions similaires

  1. Probleme avec REGEX sous IE
    Par Death83 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 18/07/2006, 20h02
  2. [RegEx] Probleme de Regex
    Par keil dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2006, 14h14
  3. probleme de regex! (debutant)
    Par kriskikout dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2006, 23h00
  4. [langage] autre probleme de regex
    Par Ludo167 dans le forum Langage
    Réponses: 3
    Dernier message: 18/08/2004, 17h01
  5. [langage] probleme de regex
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 18/08/2004, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo