Python: разделить строку с несколькими разделителями [дубликат]


этот вопрос уже есть ответ здесь:

  • Разделить строки с несколькими разделителями? 29 ответов

Я нашел некоторые ответы в интернете, но у меня нет опыта работы с регулярными выражениями, что я считаю, что здесь необходима.

у меня есть строка, которая должна быть разделена либо на '; 'или', ' То есть, это должно быть либо после запятой или запятой с пробелом. Отдельные запятые без конечных пробелов должны быть оставлены нетронутыми

пример:

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

должен быть разделен на список, содержащий следующее:

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

5 ответов:

к счастью, Python имеет этот встроенный:)

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

обновление:
после вашего комментария:

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

сделать str.replace('; ', ', ') и str.split(', ')

вот безопасный способ для любой итерации разделителей, используя регулярные выражения:

>>> 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.побег позволяет построить шаблон автоматически и иметь разделители экранированы красиво.

вот это решение как функция для вашего удовольствия от копирования:

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

Если вы собираетесь часто разделять, используя одни и те же разделители, скомпилируйте свое регулярное выражение заранее, как описано, и используйте RegexObject.split.

в ответ на ответ Джонатана выше, это, кажется, работает только для определенных разделителей. Например:

>>> 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']

помещая разделители в квадратные скобки, он, кажется, работает более эффективно.

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

вот как выглядит регулярное выражение:

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)