Вы могли попробовать:
>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWord")
'Word Word Word'
Возможно, короче:
>>> re.sub(r"\B([A-Z])", r" \1", "DoIThinkThisIsABetterAnswer?")
Если существуют последовательные прописные буквы, то результат Gregs не мог быть тем, что Вы ищете, так как \w использует символ перед буквой captial, которая будет заменена.
>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWWWWWWWord")
'Word Word WW WW WW Word'
А оглядываются, решил бы это:
>>> re.sub(r"(?<=\w)([A-Z])", r" \1", "WordWordWWWWWWWord")
'Word Word W W W W W W Word'
С regexes можно сделать это:
re.sub('([A-Z])', r' \1', str)
, Конечно, который будет только работать на символы ASCII, если Вы захотите сделать Unicode, это - совершенно новая куча проблем:-)
Взгляните на мой ответ на .NET - Как можно разделить “caps” разграниченная строка на массив?
Редактирование: , Возможно, лучше для включения его здесь.
re.sub(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))', r'\1 ', text)
, Например:
"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
Я думаю, что regexes являются способом пойти сюда, но только дать чистую версию Python без (надо надеяться), любого из проблемных О¤О–О©О¤О–О™ОџОҐ указало:
def splitCaps(s):
result = []
for ch, next in window(s+" ", 2):
result.append(ch)
if next.isupper() and not ch.isspace():
result.append(' ')
return ''.join(result)
окно () является служебной функцией, которую я использую для работы на раздвижное окно объектов, определенных как:
import collections, itertools
def window(it, winsize, step=1):
it=iter(it) # Ensure we have an iterator
l=collections.deque(itertools.islice(it, winsize))
while 1: # Continue till StopIteration gets raised.
yield tuple(l)
for i in range(step):
l.append(it.next())
l.popleft()
Я соглашаюсь, что regex решение является самым легким, но я не сказал бы, что это - большая часть pythonic.
Как насчет:
text = 'WordWordWord'
new_text = ''
for i, letter in enumerate(text):
if i and letter.isupper():
new_text += ' '
new_text += letter