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

Python Discussion :

Faire matcher mon regex sur l'ensemble de mon fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Faire matcher mon regex sur l'ensemble de mon fichier
    Bonjour à tous,

    Moi et les regex comment dire .... c'est toujours une longue histoire.

    Alors voilà je suis entrain de faire des tests de performances sur l'extraction de blocs de données dans des fichiers textes assez lourd (>500Mo).

    La méthode de lire ligne par ligne le fichier pour ensuite réécrire cette ligne dans le fichier qui va bien est assez lourde. Dans mon cas expérimental je suis à 100Mo traité au bout de 10min.

    Du coup j'ai eu l'idée de traiter mes blocs à l'aide d'une expression régulière pour ensuite écrire ces différents blocs dans des fichiers.

    Voici le fichier que je traite (une version très allégé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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    DMIG    KAAX           0       6       2       0                     144
    DMIG*   KAAX                         559               1
    *                    559               1 5.436146121D+04
    DMIG*   KAAX                         559               2
    *                    559               1 2.997528918D+00
    *                    559               2 9.038123638D+02
    DMIG*   KAAX                         559               3
    *                    559               1 1.261634118D+01
    *                    559               2 5.046148890D+03
    *                    559               3 3.415594087D+04
    DMIG*   KAAX                         559               4
    *                    559               1 3.371631556D+01
    *                    559               2-3.982366360D+01
    *                    559               3-4.056291690D+03
    *                    559               4 2.510124955D+04
    DMIG    VAX            0       9       2       0                       1
    DMIG*   VAX                            1               0
    *                    559               1 1.000000000D+00
    *                    559               2 1.000000000D+00
    *                    559               3 1.000000000D+00
    *                    559               4 1.000000000D+00
    *                    559               5 1.000000000D+00
    *                    559               6 1.000000000D+00
    *                    563               1 1.000000000D+00
    *                    563               2 1.000000000D+00
    *                    563               3 1.000000000D+00
    *                    563               4 1.000000000D+00
    *                    563               5 1.000000000D+00
    DMIG    PAX            0       9       2       0                       1
    DMIG*   PAX                            1               0
    *                    559               1 5.588391601D+01
    *                    559               2 1.168264164D+00
    *                    559               3 1.009317748D+01
    *                    559               4-1.081129573D+01
    *                    559               5-4.022276625D-01
    *                    559               6-8.447832210D-01
    *                    563               1 5.591312663D+01
    *                    563               2-6.528280697D+00
    *                    563               3-7.816536324D+00
    *                    563               4 1.078904913D+01
    *                    563               5-3.358274028D-01
    *                    563               6-8.739271547D-01
    Les 3 extractions que je souhaite faire sont les suivantes :

    Extraction 1 :

    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
     
    DMIG    KAAX           0       6       2       0                     144
    DMIG*   KAAX                         559               1
    *                    559               1 5.436146121D+04
    DMIG*   KAAX                         559               2
    *                    559               1 2.997528918D+00
    *                    559               2 9.038123638D+02
    DMIG*   KAAX                         559               3
    *                    559               1 1.261634118D+01
    *                    559               2 5.046148890D+03
    *                    559               3 3.415594087D+04
    DMIG*   KAAX                         559               4
    *                    559               1 3.371631556D+01
    *                    559               2-3.982366360D+01
    *                    559               3-4.056291690D+03
    *                    559               4 2.510124955D+04
    Extraction 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DMIG    VAX            0       9       2       0                       1
    DMIG*   VAX                            1               0
    *                    559               1 1.000000000D+00
    *                    559               2 1.000000000D+00
    *                    559               3 1.000000000D+00
    *                    559               4 1.000000000D+00
    *                    559               5 1.000000000D+00
    *                    559               6 1.000000000D+00
    *                    563               1 1.000000000D+00
    *                    563               2 1.000000000D+00
    *                    563               3 1.000000000D+00
    *                    563               4 1.000000000D+00
    *                    563               5 1.000000000D+00
    Extraction 3 :

    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
     
    DMIG    PAX            0       9       2       0                       1
    DMIG*   PAX                            1               0
    *                    559               1 5.588391601D+01
    *                    559               2 1.168264164D+00
    *                    559               3 1.009317748D+01
    *                    559               4-1.081129573D+01
    *                    559               5-4.022276625D-01
    *                    559               6-8.447832210D-01
    *                    563               1 5.591312663D+01
    *                    563               2-6.528280697D+00
    *                    563               3-7.816536324D+00
    *                    563               4 1.078904913D+01
    *                    563               5-3.358274028D-01
    *                    563               6-8.739271547D-01
    Pour les curieux les différents blocs représentent une matrice (raideur, efforts, vitesses pour ce cas précis).
    Ce fichier peut contenir d'autres matrices et on ne peut pas savoir à l'avance quelles matrices seront présentes dans le fichier, enfin si mais pas simplement.

    Du coup mon expression régulière est assez générale et ne fait pas intervenir les termes KAAX, PAX, VAX afin d'être compatible avec n'importe quelle fichier.

    J'ai réussi à produire ceci et j'ai réalisé les test sous regex101 ce qui m'a permit de constater que je trouvais bien 3 match correspondant à mes 3 blocs précédemment mentionnés.

    J'ai donc écris ce petit code, mais à ma surprise, le match ne se fait qu'avec le premier bloc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import re
     
    with open("matrix.pch", "r") as pucnhfile :
        f = pucnhfile.read()
     
    pattern = re.compile(r"(DMIG\s+[. 0-9A-Z+-.*\n]*?)(?=DMIG |\Z)")
     
    m = re.match(pattern, f)
     
    print m.groups()
    Du coup je ne comprend pas bien ce qui se passe. J'ai bien essayé de passer par le search et introduire le flag re.MULTILINE mais rien à faire je match toujours avec le premier bloc uniquement.

    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
     
    import re
     
     
    with open("matrix.pch", "r") as pucnhfile :
        f = pucnhfile.read()
     
     
    #pattern = re.compile(r"(DMIG\s+[. 0-9A-Z+-.*\n]*?)(?=DMIG |\Z)")
     
    #m = re.match(pattern, f)
     
    Matrix = re.match(r"(DMIG\s+[. 0-9A-Z+-.*\n]*?)(?=DMIG |\Z)", f, re.MULTILINE)
     
     
    print Matrix.groups()
    Lorsque je fait :

    j'obtiens le message comme quoi je suis out of range

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File "matrix_regex.py", line 15, in <module>
        print Matrix.groups()[2]
    IndexError: tuple index out of range
    Les index 0 et 1 me revoient le même premier bloc.

    Si vous avez une idée de là où sa cloche, merci d'avance pour votre aide.

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Un simple re.split suffirait je pense.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    content = '''DMIG    KAAX           0       6       2       0                     144
    DMIG*   KAAX                         559               1
    *                    559               1 5.436146121D+04
    DMIG*   KAAX                         559               2
    *                    559               1 2.997528918D+00
    *                    559               2 9.038123638D+02
    DMIG*   KAAX                         559               3
    *                    559               1 1.261634118D+01
    *                    559               2 5.046148890D+03
    *                    559               3 3.415594087D+04
    DMIG*   KAAX                         559               4
    *                    559               1 3.371631556D+01
    *                    559               2-3.982366360D+01
    *                    559               3-4.056291690D+03
    *                    559               4 2.510124955D+04
    DMIG    VAX            0       9       2       0                       1
    DMIG*   VAX                            1               0
    *                    559               1 1.000000000D+00
    *                    559               2 1.000000000D+00
    *                    559               3 1.000000000D+00
    *                    559               4 1.000000000D+00
    *                    559               5 1.000000000D+00
    *                    559               6 1.000000000D+00
    *                    563               1 1.000000000D+00
    *                    563               2 1.000000000D+00
    *                    563               3 1.000000000D+00
    *                    563               4 1.000000000D+00
    *                    563               5 1.000000000D+00
    DMIG    PAX            0       9       2       0                       1
    DMIG*   PAX                            1               0
    *                    559               1 5.588391601D+01
    *                    559               2 1.168264164D+00
    *                    559               3 1.009317748D+01
    *                    559               4-1.081129573D+01
    *                    559               5-4.022276625D-01
    *                    559               6-8.447832210D-01
    *                    563               1 5.591312663D+01
    *                    563               2-6.528280697D+00
    *                    563               3-7.816536324D+00
    *                    563               4 1.078904913D+01
    *                    563               5-3.358274028D-01
    *                    563               6-8.739271547D-01'''
     
    import re
     
    dmigs = re.split('\n(?=DMIG )', content)
     
    print(dmigs)
    Après sur un gros fichier, faut voir ce que ça donne.

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Salut.

    Un simple re.split suffirait je pense.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    content = '''DMIG    KAAX           0       6       2       0                     144
    DMIG*   KAAX                         559               1
    *                    559               1 5.436146121D+04
    DMIG*   KAAX                         559               2
    *                    559               1 2.997528918D+00
    *                    559               2 9.038123638D+02
    DMIG*   KAAX                         559               3
    *                    559               1 1.261634118D+01
    *                    559               2 5.046148890D+03
    *                    559               3 3.415594087D+04
    DMIG*   KAAX                         559               4
    *                    559               1 3.371631556D+01
    *                    559               2-3.982366360D+01
    *                    559               3-4.056291690D+03
    *                    559               4 2.510124955D+04
    DMIG    VAX            0       9       2       0                       1
    DMIG*   VAX                            1               0
    *                    559               1 1.000000000D+00
    *                    559               2 1.000000000D+00
    *                    559               3 1.000000000D+00
    *                    559               4 1.000000000D+00
    *                    559               5 1.000000000D+00
    *                    559               6 1.000000000D+00
    *                    563               1 1.000000000D+00
    *                    563               2 1.000000000D+00
    *                    563               3 1.000000000D+00
    *                    563               4 1.000000000D+00
    *                    563               5 1.000000000D+00
    DMIG    PAX            0       9       2       0                       1
    DMIG*   PAX                            1               0
    *                    559               1 5.588391601D+01
    *                    559               2 1.168264164D+00
    *                    559               3 1.009317748D+01
    *                    559               4-1.081129573D+01
    *                    559               5-4.022276625D-01
    *                    559               6-8.447832210D-01
    *                    563               1 5.591312663D+01
    *                    563               2-6.528280697D+00
    *                    563               3-7.816536324D+00
    *                    563               4 1.078904913D+01
    *                    563               5-3.358274028D-01
    *                    563               6-8.739271547D-01'''
     
    import re
     
    dmigs = re.split('\n(?=DMIG )', content)
     
    print(dmigs)
    Après sur un gros fichier, faut voir ce que ça donne.
    La méthode que je décris plus haut à montré sons efficacité sur le premier bloc de donnés qui créé un fichier de prêt de 100Mo en quelques secondes contre 10min avec la méthode dites plus usuelle de lire ligne par ligne le fichier.

    Je vais tester votre méthode qui à l'air si simple

    Je ferais un retour demain car je n'ai pas les fichiers avec moi ce soir.

    Merci

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonsoir,

    J'espérai une réponse afin de voir les résultats de ma réponse qui se trouvait sur un autre forum... où j'utilisais les dictionnaires

    EDIT: La prochaine étape est de faire du multiprocessing

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonsoir,

    J'espérai une réponse afin de voir les résultats de ma réponse qui se trouvait sur un autre forum... où j'utilisais les dictionnaires

    EDIT: La prochaine étape est de faire du multiprocessing
    Salut,

    Désolé je ne comprenais pas ton intervention. Oui ton aide m'a permit de réduire radicalement le temps d’exécution de mon code, c'est juste que j'ai quelques problèmes différents à résoudre.

    Merci et désolé je n'était pas retourné sur mon sujet j'attendais de résoudre mon problème dans sa totalité.

  6. #6
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    La méthode que je décris plus haut à montré sons efficacité sur le premier bloc de donnés qui créé un fichier de prêt de 100Mo en quelques secondes contre 10min avec la méthode dites plus usuelle de lire ligne par ligne le fichier
    Étrange que ce soit si long en lisant le fichier ligne à ligne.

    Bon sinon, plutôt que split qui stockera tout dans une liste, un itérateur serait peut-être plus performant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for block in re.finditer('DMIG .*?(?=DMIG |$)', content, flags=re.S):
        print(block.group(0))
        print('----------------')

Discussions similaires

  1. [RegEx] Faire tourner une RegEx sur l'intégralité d'un fichier
    Par General_Batton dans le forum Langage
    Réponses: 20
    Dernier message: 18/11/2017, 20h56
  2. Remplacer un mot sur l'ensemble d'un fichier texte
    Par Esmax dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 08/09/2010, 11h56
  3. [RegEx] Regex sur le contenu d'un fichier
    Par _Michel dans le forum Langage
    Réponses: 4
    Dernier message: 15/03/2009, 15h01
  4. Réponses: 2
    Dernier message: 12/05/2006, 15h58
  5. [référencement] Faire apparaitre mon site sur France
    Par francis m dans le forum Référencement
    Réponses: 8
    Dernier message: 21/10/2005, 23h40

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