Cadena dividida con múltiples delimitadores en Python

Encontré algunas respuestas en línea, pero no tengo experiencia con expresiones regulares, que creo que es lo que se necesita aquí.

Tengo una cadena que necesita ser dividida ya sea por un ‘;’ o ‘,’ Es decir, debe ser un punto y coma o una coma seguida de un espacio. Las comas individuales sin espacios finales deben dejarse intactas.

Cadena de ejemplo:

"b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3], mesitylene [000108-67-8]; polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]" 

debe dividirse en una lista que contenga lo siguiente:

 ('b-staged divinylsiloxane-bis-benzocyclobutene [124221-30-3]' , 'mesitylene [000108-67-8]', 'polymerized 1,2-dihydro-2,2,4- trimethyl quinoline [026780-96-1]') 

    Por suerte, Python tiene este incorporado 🙂

     import re re.split('; |, ',str) 

    Actualizar:
    Siguiendo tu comentario:

     >>> a='Beautiful, is; better*than\nugly' >>> import re >>> re.split('; |, |\*|\n',a) ['Beautiful', 'is', 'better', 'than', 'ugly'] 

    Haz un str.replace('; ', ', ') y luego un str.split(', ')

    Aquí hay una forma segura para cualquier iterable de delimitadores, usando expresiones regulares:

     >>> import re >>> delimiters = "a", "...", "(c)" >>> example = "stackoverflow (c) is awesome... isn't it?" >>> regexPattern = '|'.join(map(re.escape, delimiters)) >>> regexPattern 'a|\\.\\.\\.|\\(c\\)' >>> re.split(regexPattern, example) ['st', 'ckoverflow ', ' is ', 'wesome', " isn't it?"] 

    re.escape permite construir el patrón automáticamente y hacer que los delimitadores se escapen bien.

    Aquí está esta solución como una función para su placer de copiar y pegar:

     def split(delimiters, string, maxsplit=0): import re regexPattern = '|'.join(map(re.escape, delimiters)) return re.split(regexPattern, string, maxsplit) 

    Si va a dividirse con frecuencia utilizando los mismos delimitadores, compile de antemano su expresión regular como se describe y use RegexObject.split .

    En respuesta a la respuesta anterior de Jonathan, esto solo parece funcionar para ciertos delimitadores. Por ejemplo:

     >>> a='Beautiful, is; better*than\nugly' >>> import re >>> re.split('; |, |\*|\n',a) ['Beautiful', 'is', 'better', 'than', 'ugly'] >>> b='1999-05-03 10:37:00' >>> re.split('- :', b) ['1999-05-03 10:37:00'] 

    Al poner los delimitadores entre corchetes, parece funcionar mejor.

     >>> re.split('[- :]', b) ['1999', '05', '03', '10', '37', '00'] 

    Así es como se ve la expresión regular:

     import re # "semicolon or (a comma followed by a space)" pattern = re.compile(r";|, ") # "(semicolon or a comma) followed by a space" pattern = re.compile(r"[;,] ") print pattern.split(text)