Je ne sais pas ce que vous cherchez vraiment, mais
import re
data = "date=2010-05-09,time=16:41:27,device_id=FE-2KA3F09000049,log_id=0400147717,log_part=00,type=statistics,subtype=n/a,pri=information,session_id=o49CedRc021772,from=\"[email protected]\",mailer=\"mta\",client_name=\"example.org,[194.177.17.24]\",resolved=OK,to=\"[email protected]\",direction=\"in\",message_length=6832079,virus=\"\",disposition=\"Accept\",classifier=\"Not,Spam\",subject=\"=?windows-1255?B?Rlc6IEZ3OiDg5fDp5fog+fno5fog7Pf46eHp7S3u4+Tp7SE=?=\""
pattern = r"""(\w+)=((?:"(?:\\.|[^\\"])*"|'(?:\\.|[^\\'])*'|[^\\,"'])+)"""
print(re.findall(pattern, data))
vous donne
[('date', '2010-05-09'), ('time', '16:41:27'), ('device_id', 'FE-2KA3F09000049'),
('log_id', '0400147717'), ('log_part', '00'), ('type', 'statistics'),
('subtype', 'n/a'), ('pri', 'information'), ('session_id', 'o49CedRc021772'),
('from', '"[email protected]"'), ('mailer', '"mta"'),
('client_name', '"example.org,[194.177.17.24]"'), ('resolved', 'OK'),
('to', '"[email protected]"'), ('direction', '"in"'),
('message_length', '6832079'), ('virus', '""'), ('disposition', '"Accept"'),
('classifier', '"Not,Spam"'),
('subject', '"=?windows-1255?B?Rlc6IEZ3OiDg5fDp5fog+fno5fog7Pf46eHp7S3u4+Tp7SE=?="')
]
Vous pouvez nettoyer les chaînes entre guillemets après (en utilisant mystring.strip("'\"")
).
EDIT: Cette regex maintenant gère correctement guillemets échappés à l'intérieur des chaînes entre guillemets (a="She said \"Hi!\""
).
Explication de la regex:
(\w+)=((?:"(?:\\.|[^\\"])*"|'(?:\\.|[^\\'])*'|[^\\,"'])+)
(\w+)
: Faites correspondre l'identifiant et le capturer en backreference pas. 1
=
: Match un =
(
: saisir les éléments suivants dans backreference pas. 2:
(?:
: L'un des suivants:
"(?:\\.|[^\\"])*"
: Un guillemet, suivi de zéro ou plusieurs des éléments suivants: un caractère échappé ou un caractère non-citation/non-barre oblique inverse, suivie d'une autre guillemet
|
: ou
'(?:\\.|[^\\'])*'
: Voir ci-dessus, juste pour des guillemets simples.
|
: ou
[^\\,"']
: un caractère qui est ni une barre oblique inverse, une virgule, ni une citation.
)+
: répéter au moins une fois, autant de fois que possible.
)
: fin du groupe de capture no. 2.
Merci ce fait ce que je avais besoin. – gtfx
Voici comment vous faites regex !! :) – jathanism