Один из способов сделать это - использовать findall
с регулярным выражением, которое с жадностью совпадает с вещами, которые могут проходить между разделителями. например:
>>> s = "Wilbur Smith (Billy, son of John), Eddie Murphy (John), Elvis Presley, Jane Doe (Jane Doe)"
>>> r = re.compile(r'(?:[^,(]|\([^)]*\))+')
>>> r.findall(s)
['Wilbur Smith (Billy, son of John)', ' Eddie Murphy (John)', ' Elvis Presley', ' Jane Doe (Jane Doe)']
Повторное выражение выше соответствует одному или нескольким:
. Одна из особенностей этого подхода состоит в том, что соседние разделители рассматриваются как один разделитель. То есть вы не увидите пустую строку. Это может быть ошибка или функция в зависимости от вашего прецедента.
Также обратите внимание, что регулярные выражения not подходят для случаев, когда вложенность является возможностью. Так, например, это будет неправильно разбито:
"Wilbur Smith (son of John (Johnny, son of James), aka Billy), Eddie Murphy (John)"
Если вам нужно иметь дело с вложением, лучшим выбором будет разбиение строки на парсеры, запятые и все остальное (в основном, токенизация - это часть все равно может выполняться с помощью регулярных выражений), а затем пройдите через те маркеры, которые снова собирают поля, отслеживая уровень вашего гнездования, когда вы идете (это отслеживание уровня вложенности - это то, что регулярные выражения не могут делать самостоятельно).