No estoy seguro de lo que realmente está buscando, pero
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))
le da
[('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=?="')
]
Es posible que desee para limpiar las cadenas entre comillas después (usando mystring.strip("'\"")
).
EDIT: Esta expresión regular ahora también maneja correctamente las comillas escapadas dentro de las cadenas entre comillas (a="She said \"Hi!\""
).
Explicación de la expresión regular:
(\w+)=((?:"(?:\\.|[^\\"])*"|'(?:\\.|[^\\'])*'|[^\\,"'])+)
(\w+)
: coincidir con el identificador y la captura en referencia inversa no. 1
=
: coincidir con un =
(
: capturar el siguiente en referencia inversa no. 2:
(?:
: Uno de los siguientes:
"(?:\\.|[^\\"])*"
: Una doble cita, seguido de cero o más de los siguientes: un carácter de escape o un carácter/no backslash no cita, seguido de otro comillas dobles
|
: o
'(?:\\.|[^\\'])*'
: Véase más arriba, sólo por comillas simples.
|
: o
[^\\,"']
: un carácter que no es ni una barra invertida, una coma, ni una cita.
)+
: repetir al menos una vez, tantas veces como sea posible.
)
: fin del grupo de captura no. 2.
Gracias este hizo lo que necesitaba. – gtfx
¡¡Así es como lo haces con la expresión regular !! :) – jathanism