Bonjour,
je voudrais passer de "bla bla 34 5 6 78 9 0 bla bla" à "bla bla 34567890 bla bla".
Toute info. est la bienvenue.
Bonjour,
je voudrais passer de "bla bla 34 5 6 78 9 0 bla bla" à "bla bla 34567890 bla bla".
Toute info. est la bienvenue.
Bonjour,
Ce n'est peut-être pas très subtil, mais ça marche:
Le principe n'est pas très compliqué:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 import re def remplace(matchobj): return matchobj.group(1) ch = "bla bla 34 5 6 78 9 0 bla bla" res = re.sub(r"([0-9]) (?=[0-9])", remplace, ch) print res bla bla 34567890 bla bla
Si on oublie le (?=), la recherche avance d'un caractère de plus, et comme elle se fait sans recouvrement, l'espace après le '5' est ignoré.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 ([0-9]) <== un chiffre <== un espace (?=[0-9]) <== un chiffre mais ne "consomme pas" un caractère de recherche
La fonction remplace() construit la chaine de remplacement à partie du 1er groupe trouvé qui est le seul 1er caractère du motif (c'est pour trouver ce groupe qu'il est entre parenthèses).
Tyrtamos
S’il y a plusieurs blancs entre les chiffres, ta regex ne marche pas, tyrtamos. Il faut ajouter une étoile après le blanc dans ta RE.
Mais rambc n’a pas précisé s’il peut y avoir plusieurs blancs entre les chiffres. Si ce n’est pas le cas, il ne faut pas ajouter une étoile.
En tous cas, ta méthode de traitement des blancs inter-chiffres les uns après les autres est plus longue qu’une méthode basée sur le traitement des chaînes de chiffres matchantes d’un seul coup.
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 import re from time import clock ch = '''jhgjhgasd 563 6 4765 7hhdhgfgf 6757 7 4 34lklkkdf hghg 564 75 8 lkiurr sss 4 4 5 3 2 34 lkjhfyyt poiu 75 6 ljhf 8d89 34h5t 673 dj47 478 3 222 390 nytir''' te = clock() for i in xrange(10000): # methode replace sur chaines matchantes ch = re.sub('\d[\d ]*\d',lambda m: m.group().replace(' ',''),ch) tf = clock() print '- methode replace sur chaines matchantes \n',tf - te,'secondes' print ch ch = '''jhgjhgasd 563 6 4765 7hhdhgfgf 6757 7 4 34lklkkdf hghg 564 75 8 lkiurr sss 4 4 5 3 2 34 lkjhfyyt poiu 75 6 ljhf 8d89 34h5t 673 dj47 478 3 222 390 nytir''' te = clock() for i in xrange(10000): # methode tyrtamos res = re.sub(r"([0-9]) (?=[0-9])", lambda m: m.group(1), ch) tf = clock() print '\n- methode tyrtamos \n',tf - te,'secondes' print res ch = '''jhgjhgasd 563 6 4765 7hhdhgfgf 6757 7 4 34lklkkdf hghg 564 75 8 lkiurr sss 4 4 5 3 2 34 lkjhfyyt poiu 75 6 ljhf 8d89 34h5t 673 dj47 478 3 222 390 nytir''''' te = clock() for i in xrange(10000): # methode tyrtamos avec etoile ajoutee dans la RE res = re.sub(r"([0-9]) *(?=[0-9])", lambda m: m.group(1), ch) tf = clock() print '\n- methode tyrtamos avec etoile ajoutee dans la RE \n',tf - te,'secondes' print res
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 - methode replace sur chaines matchantes 1.87107579315 secondes jhgjhgasd 563647657hhdhgfgf 67577434lklkkdf hghg 564758 lkiurr sss 4453234 lkjhfyyt poiu 756 ljhf 8d8934h5t 673 dj474783222390 nytir - methode tyrtamos 2.59343184678 secondes jhgjhgasd 563647657hhdhgfgf 67577434lklkkdf hghg 564758 lkiurr sss 4453 234 lkjhfyyt poiu 756 ljhf 8d8934h5t 673 dj47 4783 222 390 nytir - methode tyrtamos avec etoile ajoutee dans la RE 5.32312123468 secondes jhgjhgasd 563647657hhdhgfgf 67577434lklkkdf hghg 564758 lkiurr sss 4453234 lkjhfyyt poiu 756 ljhf 8d8934h5t 673 dj474783222390 nytir
Merci. La 1ère méthode me convient.
Ce n'est pas mon genre du tout...Effectivement il peut y avoir plusieurs espaces.
Il me reste une dernière chose à faire, à savoir ajouter un espace entre un chiffre et une lettre pour au final passer de "abcde bjhjhgjg12345 7899900 dghdgsv 9000kjhskjhjq" à "abcde bjhjhgjg 123457899900 dghdgsv 9000 kjhskjhjq".
Je pourrais alors finaliser un petit script qui permet passer d'un nombre écrit, comme "deux cents trois", à sa traduction en chiffre, soit "203" avec mon exemple.
Effectivement, je n'avais pas pensé à lambda (merci eyquem!), ce qui permet d'éliminer la fonction remplace().
Mon expression se simplifie alors. J'y ai ajouté le traitement de plusieurs espaces (avec un '+' et pas un '*'):
Il est possible que je rattrape ainsi une partie du temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 res = re.sub(r"([0-9])[ ]+(?=[0-9])", lambda m: m.group(1), ch)
Je n'ai pas encore vu la suite.
Tyrtamos
Pour la deuxième fonctionnalité, le code suivant semble faire l'affaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #! /usr/bin/env python import re text = 'abcde bjhjhgjg12345 7899900 dghdgsv 9000kjhskjhjq' def myRemplaceFunction(match): textFound = match.group() if textFound[0] != ' ' and textFound[1] != ' ': textFound = textFound[0] + ' ' + textFound[1] return textFound print(re.sub('((\d\D)|(\D\d))', myRemplaceFunction, text))
Partager