Dividir una cadena con múltiples delimitadores en Python

He encontrado algunas respuestas en Internet, pero no tengo experiencia con expresiones regulares, que creo que es lo que se necesita aquí.

Tengo una cadena que necesita ser dividida por un ';' o ', ' Es decir, tiene que ser un punto y coma o una coma seguida de un espacio. Las comas individuales sin espacios finales deben dejarse sin tocar

Ejemplo de cadena:

"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]') 
Solución

Por suerte, Python lo tiene incorporado :)

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

Actualización:
Siguiendo tu comentario:

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

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

Comentarios (7)

Aquí's 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?"]

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

Aquí's esta solución como una función para su placer de copiar-pegar:

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

Si usted'va a dividir a menudo usando los mismos delimitadores, compile su expresión regular de antemano como se describe y use [RegexObject.split][split].

[escape]: http://docs.python.org/2/library/re.html#re.escape [split]: http://docs.python.org/2/library/re.html#re.RegexObject.split

Comentarios (4)

En respuesta a la respuesta de Jonathan arriba, esto sólo 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']

Poniendo los delimitadores entre corchetes parece funcionar más eficazmente.

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

Así es como se ve la regex:

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)
Comentarios (1)