que tiene una cadena de tal formato:¿Cómo dividir una cadena por comas posicionadas fuera de paréntesis?
"Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
por lo que es básicamente la lista de los nombres de los actores (opcionalmente seguido por su papel en paréntesis). El rol en sí mismo puede contener coma (el nombre del actor no puede, realmente lo espero).
Mi objetivo es dividir esta cadena en una lista de pares - (actor name, actor role)
.
Una solución obvia sería la de ir a través de cada personaje, la verificación de ocurrencias de '('
, ')'
y ','
, que se dividió cada vez que una coma occures exterior. Pero esto parece un poco pesado ...
Estaba pensando en spliting usando una expresión regular: en primer lugar dividir la cadena mediante paréntesis:
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', '']
Los elementos impares aquí son nombres de actores, incluso son los papeles. Entonces podría dividir los nombres por comas y de alguna manera extraer los pares nombre-rol. Pero esto parece incluso peor que mi primer enfoque.
¿Hay alguna manera más fácil/más agradable de hacer esto, ya sea con una sola expresión regular o una buena pieza de código?
Se puede dividir en campos de inmediato, haciendo coincidir los registros en lugar de separadores: [(m.group ("nombre"), m.group ("papel")) para m de re.findall ("(? P. +?) (? \ ((? P [^ \)] +) \) (, \ s * | $)) ", x)] –
+1 para la solución de token si la necesita. Aparece dentro y fuera de la pila mientras camina hacia arriba y hacia abajo ... una forma clásica de hacerlo. –
cada vez que veo la expresión regular que es útil, como esta, empiezo a preguntarme: ¿deberían ser legibles por los humanos? O solo soy yo ... ¿quién no lo ve desde el primer vistazo? – kender