ho avuto una serie di tale formato:Come dividere una stringa con virgole posizionate al di fuori della parentesi?
"Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
quindi fondamentalmente è l'elenco dei nomi di attori (eventualmente seguita da loro ruolo tra parentesi). Il ruolo stesso può contenere una virgola (il nome dell'attore non può, lo spero fortemente).
Il mio obiettivo è dividere questa stringa in un elenco di coppie - (actor name, actor role)
.
Una soluzione ovvia sarebbe quella di passare attraverso ogni carattere, controllare le occorrenze di '('
, ')'
e ','
e dividere ogni volta una virgola occures fuori. Ma questo sembra un po 'pesante ...
stavo pensando spliting utilizzando un regexp: prima dividere la stringa da parentesi:
import re
x = "Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
s = re.split(r'[()]', x)
# ['Wilbur Smith ', 'Billy, son of John', ', Eddie Murphy ', 'John', ', Elvis Presley, Jane Doe ', 'Jane Doe', '']
Gli elementi dispari qui sono i nomi di attori, anche sono i ruoli. Quindi potrei dividere i nomi con delle virgole e in qualche modo estrarre le coppie nome-ruolo. Ma questo sembra ancora peggio del mio primo approccio.
Esistono modi più semplici/più belli per eseguire questa operazione, con una singola espressione regolare o un bel pezzo di codice?
È possibile dividere in campi subito abbinando record invece che i separatori: [(m.group ("nome"), m.group ("ruolo")) per m di re.findall ("(? P. +?) (? \ ((? P [^ \)] +) \) (, \ s * | $)) ", x)] –
+1 per la soluzione token se ne ha bisogno. Scendi e scendi dalla pila mentre cammini su e giù ... un modo classico per farlo. –
ogni volta che vedo l'espressione regolare che è utile, come questa, comincio a chiedermi - dovrebbero essere leggibili? O sono solo io ... chi non lo vede dal primo sguardo? – kender