Code python buggé, histoire sombre de régex, listes et consoles... [Résolu]

Signaler
Messages postés
40
Date d'inscription
lundi 20 avril 2020
Statut
Membre
Dernière intervention
24 février 2021
-
Messages postés
15624
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 février 2021
-
(Re)bonsoir à tous, et merci de votre aide,

Après modification de mon code de la dernière fois, et changement de méthode car ce changement n'amenait pas de réponses, je reviens avec de nouveaux problèmes python étranges et inquiétants.

Cette fois, ça m'a l'air plus compliqué. Pour faire simple, je mets mon code juste après.

from pyexcel_ods3 import get_data
import re

dat = get_data("occurences biogrammes.ods")
data = str(dat)
prem = input("Quelle est la première lettre ?")

print(data)

occurencesmatch = re.search(("['"+prem),data)
print(occurencesmatch)
occurrences = occurencesmatch[24:-13]

print("les occurences sont " + occurences)
    


En gros, j'essaie de noter les positions de la lettre demandée au milieu de mon string
data
, là où elle commence les crochets.

str(data)
ressemble à ça :
OrderedDict([('Sheet1', [['_', 'd', 0], ['g', 'p', 0], ['b', 'v', 0], ['-', ',', 0], ['a', ')', 0.01],


Tout est normalement censé marcher (comme toujours...), or ça ne fonctionne pas, et la console s'excite un peu :

Traceback (most recent call last):
File "C:\Users\Utilisateur\...\programme py générateur", line 13, in <module>
occurencesmatch = re.search(("['"+prem),data)
File "C:\Users\Utilisateur\AppData\Local\Programs\Thonny\lib\re.py", line 185, in search
return _compile(pattern, flags).search(string)
File "C:\Users\Utilisateur\AppData\Local\Programs\Thonny\lib\re.py", line 288, in _compile
p = sre_compile.compile(pattern, flags)
File "C:\Users\Utilisateur\AppData\Local\Programs\Thonny\lib\sre_compile.py", line 764, in compile
p = sre_parse.parse(p, flags)
File "C:\Users\Utilisateur\AppData\Local\Programs\Thonny\lib\sre_parse.py", line 924, in parse
p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
File "C:\Users\Utilisateur\AppData\Local\Programs\Thonny\lib\sre_parse.py", line 420, in _parse_sub
not nested and not items))
File "C:\Users\Utilisateur\AppData\Local\Programs\Thonny\lib\sre_parse.py", line 526, in _parse
source.tell() - here)
re.error: unterminated character set at position 0



-> Donc l'erreur est un caractère non-fini comme début de liste. Mais qu'est-ce qu'un caractère non-fini ?

Plus important encore, qu'est-ce qui ne va pas ?


Promis, si ça fonctionne, je vous enverrait des mots personnalisés de mon cru avec mon générateur ;-D

Merci beaucoup !


1 réponse

Messages postés
15624
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
26 février 2021
666
Bonsoir

le plus simple quand on a des problèmes avec les regex, c'est d'utiliser un site ou un logiciel dédié à les tester.
Le gros avantage, est que souvent, cela colorise les captures dans le texte source. On voit ainsi ce qu'il se passe au fur et à mesure.

Il faut faire attention de se servir d'un outil qui utilise le même moteur de regex que toi (chaque implémentation est sensiblement différente).

Par exemple, https://regex101.com/ permet de choisir le moteur de regex de Python 2.7

Si je tape
['g
dans la zone de saisie de la regex, ce site me retourne une erreur
[ Character class missing closing bracket
parce qu'en fait les crochets ont une signification en regex, tu en ouvres un sans le refermer. Ce qui n'est pas compréhensible pour le moteur de regex.

Je suppose que tu veux trouver le caractère [ dans ce cas, comme tous les caractères utilisés dans les instructions, il faut le signaler par un échappement
\['g


Pour voir ce que ça capture
https://regex101.com/r/uSZygY/1