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
re.split('; |, ',str)
Обновление:
После вашего комментария:
>>> a='Beautiful, is; better*than\nugly'
>>> import re
>>> re.split('; |, |\*|\n',a)
['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?"
>>> regexPattern = '|'.join(map(re.escape, delimiters))
>>> regexPattern
'a|\\.\\.\\.|\\(c\\)'
>>> re.split(regexPattern, example)
['st', 'ckoverflow ', ' is ', 'wesome', " isn't it?"]
re.escape позволяет автоматически создавать шаблон и отлично стирать разделители.
Здесь это решение как функция для вашего удовольствия от копирования:
def split(delimiters, string, maxsplit=0):
import re
regexPattern = '|'.join(map(re.escape, delimiters))
return re.split(regexPattern, string, maxsplit)
Если вы собираетесь делиться часто с использованием тех же разделителей, заранее скопируйте свое регулярное выражение, как описано, и используйте RegexObject.split
.
Ответ 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']
Ответ 5
Вот как выглядит регулярное выражение:
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)