Reemplace cada letra mayúscula 'L' en el dado con un espacio vacío más esa letra "L". Podemos hacer esto usando la comprensión de listas o podemos definir una función para hacerlo de la siguiente manera.
s = 'TheLongANDWindingRoad ABC A123B45'
''.join([char if (char.islower() or not char.isalpha()) else ' '+char for char in list(s)]).strip().split()
>>> ['The', 'Long', 'A', 'N', 'D', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']
Si elige ir por una función, así es como.
def splitAtUpperCase(text):
result = ""
for char in text:
if char.isupper():
result += " " + char
else:
result += char
return result.split()
En el caso del ejemplo dado:
print(splitAtUpperCase('TheLongAndWindingRoad'))
>>>['The', 'Long', 'A', 'N', 'D', 'Winding', 'Road']
Pero la mayoría de las veces que dividimos una oración en letras mayúsculas, suele ocurrir que queremos mantener abreviaturas que suelen ser un flujo continuo de letras mayúsculas. El siguiente código ayudaría.
def splitAtUpperCase(s):
for i in range(len(s)-1)[::-1]:
if s[i].isupper() and s[i+1].islower():
s = s[:i]+' '+s[i:]
if s[i].isupper() and s[i-1].islower():
s = s[:i]+' '+s[i:]
return s.split()
splitAtUpperCase('TheLongANDWindingRoad')
>>> ['The', 'Long', 'AND', 'Winding', 'Road']
Gracias.