Я полагаю, что вы можете использовать split с этим регулярным выражением
(?<=>)(?=[a-z<])|(?<=[a-z>])(?=<)
https://regex101.com/r/WNy5n9/1
Это не более чем 2 варианта с парными утверждениями взгляд назад / вперед.
Расширенное
(?<= > ) # Behind a >
(?= [a-z<] ) # Ahead either a-z or <
| # or,
(?<= [a-z>] ) # Behind either a-z or >
(?= < ) # Ahead a <
Обновление
Обратите внимание, что в версиях Python до версии 3.7 разбиение
на пустое совпадениене был обработан правильно.
Предположительно, они не могли определить разницу между пустой строкой
и / или как выполнить удар вдоль при совпадениях нулевой ширины.
Похоже, они вытащили свои головы из своих ** теперь в версии 3.7,
, так что вы идете ..
Демо
Версия 3.7.3
>>> import sys
>>> print( sys.version )
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)]
Код
>>> import re
>>> rx = re.compile( r"(?<=>)(?=[a-z<])|(?<=[a-z>])(?=<)" )
>>> s = "<abc>d<e><f>ghi<j>test><g>"
>>> x = re.split( rx, s )
>>> print ( x )
['<abc>', 'd', '<e>', '<f>', 'ghi', '<j>', 'test>', '<g>']