Вопрос-Ответ

Split string with multiple delimiters in Python [duplicate]

Разделить строку с несколькими разделителями в Python

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

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

Пример строки:

"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]') 
Переведено автоматически
Ответ 1

К счастью, в Python есть это встроенное :)

import re

# Regex pattern splits on substrings "; " and ", "
re.split('; |, ', string_to_split)

Обновить:

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

>>> string_to_split = 'Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n', string_to_split)
['Beautiful', 'is', 'better', 'than', 'ugly']
Ответ 2

Выполните a str.replace('; ', ', '), а затем a str.split(', ')

Ответ 3

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

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

re.escape позволяет автоматически создавать шаблон и красиво экранировать разделители.

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

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

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


Если вы хотите оставить исходные разделители в строке, вы можете изменить регулярное выражение, чтобы вместо этого использовать утверждение lookbehind:

>>> import re
>>> delimiters = "a", "...", "(c)"
>>> example = "stackoverflow (c) is awesome... isn't it?"
>>> regex_pattern = '|'.join('(?<={})'.format(re.escape(delim)) for delim in delimiters)
>>> regex_pattern
'(?<=a)|(?<=\\.\\.\\.)|(?<=\\(c\\))'
>>> re.split(regex_pattern, example)
['sta', 'ckoverflow (c)', ' is a', 'wesome...', " isn't it?"]

(замените ?<= на ?=, чтобы прикрепить разделители к правой стороне, а не к левой)

Ответ 4

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

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