È possibile utilizzare un'espressione regolare, catturando tutti i gruppi "fissi" e utilizzando tutto ciò che rimane per info
. Questo dovrebbe funzionare anche se la parte info
contiene ,
o =
caratteri. Ecco un breve esempio (usando Python, ma non dovrebbe essere un problema ...).
>>> p = r"(type=[A-Z]+), (languageCode=[-A-Z]+), (url=[^,]+), (ref=\d), (info=.+?), (deactivated=(?:true|false))"
>>> s = "type=INFO, languageCode=EN-GB, url=http://www.stackoverflow.com, ref=1, info=Text, that may contain all kind of chars, even deactivated=true., deactivated=false"
>>> re.search(p, s).groups()
('type=INFO',
'languageCode=EN-GB',
'url=http://www.stackoverflow.com',
'ref=1',
'info=Text, that may contain all kind of chars, even deactivated=true.',
'deactivated=false')
Se uno qualsiasi di questi elementi sono opzionali, si può mettere un ?
dopo quei gruppi, e rendere la virgola opzionale. Se l'ordine può essere diverso, allora è più complicato. In questo caso, invece di utilizzare una RegEx per acquisire tutto in una volta, utilizzare più RegEx per acquisire i singoli attributi e quindi rimuovere (sostituire con ''
) quelli nella stringa prima di trovare la corrispondenza con l'attributo successivo. Infine, corrisponde a info
.
Su ulteriore considerazione, dal momento che questi attributi potrebbero avere qualsiasi ordine, può essere più promettente per catturare proprio tutto si estende da una parola chiave per il prossimo, indipendentemente dal suo effettivo contenuto, molto simile alla soluzione di Pshemo:
keys = "type|languageCode|url|ref|info|deactivated"
p = r"({0})=(.+?)(?=\, (?:{0})=|$)".format(keys)
matches = re.findall(p, s)
Ma anche questo potrebbe non riuscire in alcuni casi molto oscuri, ad esempio se l'attributo info
contiene qualcosa come ', ref=foo'
, inclusa la virgola. Tuttavia, sembra non esserci alcun modo per aggirare queste ambiguità. Se avevi una stringa come info=in this string, ref=1, and in another, ref=2, ref=1
, contiene un attributo ref
o tre o nessuno?
è ordine di questi elementi fissi? – Pshemo
Come cercare '=' e quindi scegliere la singola parola davanti ad essa come nome del campo. Tutto dopo '=' fino a quando il nome del campo successivo è il valore. Questo presuppone che il valore non possa contenere '=' - se può, non hai molto da fare. – xxbbcc
Se tutti gli attributi _other_ hanno un formato un po 'prevedibile, è possibile rimuoverli e prendere quello che rimane per 'info' ... –