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.