Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

conversion en string raw

2 réponses
Avatar
plp
Bonjour,

J'écris un script pour supprimer les spams directement sur une boite
IMAP. Cela fonctionne mais pour l'instant, je stocke mes expressions
régulières directement dans mon code, dans une liste du style

liste_regex = [
r'.*@vgtru.*',
r'.*@billgst.*',
r'.*@.*mademoiselle.*shopping.*',
r'.*@.*canalprivilege.*',
r'.*@.*design.*atylia.*',
r'.*@.*news.*info2pro.*'
]

Je fais ensuite un re.match() sur les mails avec cette liste et cela
fonctionne.

Maintenant, je voudrais sortir les regex de mon script pour les stocker
dans un fichier texte (ou une bdd) comme cela :
.*@vgtru.*
.*@billgst.*
.*@.*mademoiselle.*shopping.*
.*@.*canalprivilege.*
.*@.*design.*atylia.*
.*@.*news.*info2pro.*

J'arrive évidemment à lire le fichier txt et à alimenter la liste mais
je n'arrive pas à obtenir le format raw apporté par le r'' et donc mon
re.match() ne fonctionne plus.

Avez-vous une solution ?
Merci par avance

2 réponses

Avatar
Doug713705
Le 18-10-2016, plp nous expliquait dans
fr.comp.lang.python
(<580667da$0$3334$) :
Bonjour,
J'écris un script pour supprimer les spams directement sur une boite
IMAP. Cela fonctionne mais pour l'instant, je stocke mes expressions
régulières directement dans mon code, dans une liste du style
liste_regex = [
r'.*@vgtru.*',
r'.*@billgst.*',
r'.*@.*mademoiselle.*shopping.*',
r'.*@.*canalprivilege.*',
r'.*@.*design.*atylia.*',
r'.*@.*news.*info2pro.*'
]
Je fais ensuite un re.match() sur les mails avec cette liste et cela
fonctionne.
Maintenant, je voudrais sortir les regex de mon script pour les stocker
dans un fichier texte (ou une bdd) comme cela :
.*@vgtru.*
.*@billgst.*
.*@.*mademoiselle.*shopping.*
.*@.*canalprivilege.*
.*@.*design.*atylia.*
.*@.*news.*info2pro.*
J'arrive évidemment à lire le fichier txt et à alimenter la liste mais
je n'arrive pas à obtenir le format raw apporté par le r'' et donc mon
re.match() ne fonctionne plus.

Je passe peut-être à coté de quelque chose mais d'après moi, à moins que
tu aies d'autres expressions régulières que celles-ci, je ne vois pas
pourquoi tu aurais besoin de raw strings dans la mesure où tu n'utilises
aucun caractère spéciaux (n, t, etc).
Cependant, pour répondre à ta question, appliquer
ma_chaine = ma_chaine.encode('string-escape')
à chacune des chaines de caractères lues devrait faire l'affaire.
--
Je ne connaîtrai rien de tes habitudes
Il se peut même que tu sois décédée
Mais j'demanderai ta main pour la couper
-- H.F. Thiéfaine, L'ascenceur de 22H43
Avatar
Pierre Maurette
plp :
Bonjour,
J'écris un script pour supprimer les spams directement sur une boite IMAP.
Cela fonctionne mais pour l'instant, je stocke mes expressions régulières
directement dans mon code, dans une liste du style
liste_regex = [
r'.*@vgtru.*',
r'.*@billgst.*',
r'.*@.*mademoiselle.*shopping.*',
r'.*@.*canalprivilege.*',
r'.*@.*design.*atylia.*',
r'.*@.*news.*info2pro.*'
]
Je fais ensuite un re.match() sur les mails avec cette liste et cela
fonctionne.
Maintenant, je voudrais sortir les regex de mon script pour les stocker dans
un fichier texte (ou une bdd) comme cela :
.*@vgtru.*
.*@billgst.*
.*@.*mademoiselle.*shopping.*
.*@.*canalprivilege.*
.*@.*design.*atylia.*
.*@.*news.*info2pro.*
J'arrive évidemment à lire le fichier txt et à alimenter la liste mais je
n'arrive pas à obtenir le format raw apporté par le r'' et donc mon
re.match() ne fonctionne plus.
Avez-vous une solution ?

Justement l'avantage du fichier txt en entrée de données est de ne pas
avoir à se "préoccuper du r". C'est un truc que j'utilise énormément
pour pouvoir par exemple entrer des chemins par copier-coller. En
particulier des chemins Windows sans modifier les antislashes, et
encore plus en particulier quand un antislash est final.
Peut-être avez-vous loupé (trop réfléchi ?) votre fichier .txt ?
Peut-être le lisez-vous mal ? C'est peut-être un des cas où un 'r' est
nécessaire, et non un 'rb'.
Par curiosité, j'ai testé (sous Windows et Linux, en 2.7.x et 3.4.x,
mêmes résultats):
fichier test.txt:
.*@vgtrut.*
.*@billgst.*
.*@vgtrut.*
.*@billgst.*
.*@.*mademoiselle.*shopping.*
.*@.*canalprivilege.*
.*@.*design.*atylia.*
.*@.*news.*info2pro.*
fichier test.py:
#!/usr/bin python3
# -*- coding: utf-8 -*-
import sys
print(sys.version)
liste_regex = [
r'.*@vgtrut.*',
r'.*@billgst.*',
'.*@vgtrut.*',
'.*@billgst.*',
r'.*@.*mademoiselle.*shopping.*',
r'.*@.*canalprivilege.*',
r'.*@.*design.*atylia.*',
r'.*@.*news.*info2pro.*'
]
with open('test.txt', 'r') as fichier:
for n, line in enumerate(fichier.readlines()):
print('%s [ %s (%s) | %s (%s) ]' % (line.strip() ==
liste_regex[n], line.strip(), type(line.strip()), liste_regex[n] ,
type(liste_regex[n])))
Par rapport à votre exemple, j'ai ajouté un t qui justifie le r''.
J'ai également ajouté deux lignes sans ce r'', dont une avec le
caractère spécial. Le résultat est conforme à mes attentes, et à partir
de ce résultat, je ne vois pas comment vos regex pourraient ne pas
fonctionner:
D:PythonsWinPython-64bit-3.4.3.6python-3.4.3.amd64pythonw.exe
U:/EclipseWorkspaces/EclipsePython/test/src/test.py
3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit
(AMD64)]
True [ .*@vgtrut.* (<class 'str'>) | .*@vgtrut.* (<class 'str'>) ]
True [ .*@billgst.* (<class 'str'>) | .*@billgst.* (<class 'str'>) ]
False [ .*@vgtrut.* (<class 'str'>) | .*@vgtru .* (<class 'str'>) ]
True [ .*@billgst.* (<class 'str'>) | .*@billgst.* (<class 'str'>) ]
True [ .*@.*mademoiselle.*shopping.* (<class 'str'>) |
.*@.*mademoiselle.*shopping.* (<class 'str'>) ]
True [ .*@.*canalprivilege.* (<class 'str'>) | .*@.*canalprivilege.*
(<class 'str'>) ]
True [ .*@.*design.*atylia.* (<class 'str'>) | .*@.*design.*atylia.*
(<class 'str'>) ]
True [ .*@.*news.*info2pro.* (<class 'str'>) | .*@.*news.*info2pro.*
(<class 'str'>) ]
Process finished with exit code 0
--
Pierre Maurette