pythonic способ вставить пробел перед прописными буквами

21
задан Cœur 22 April 2018 в 06:23
поделиться

7 ответов

Вы могли попробовать:

>>> re.sub(r"(\w)([A-Z])", r"\1 \2", "WordWordWord")
'Word Word Word'
37
ответ дан Greg Hewgill 29 November 2019 в 06:10
поделиться

Возможно, короче:

>>> re.sub(r"\B([A-Z])", r" \1", "DoIThinkThisIsABetterAnswer?")
10
ответ дан tzot 29 November 2019 в 06:10
поделиться

Если существуют последовательные прописные буквы, то результат 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'
27
ответ дан 29 November 2019 в 06:10
поделиться

С regexes можно сделать это:

re.sub('([A-Z])', r' \1', str)

, Конечно, который будет только работать на символы ASCII, если Вы захотите сделать Unicode, это - совершенно новая куча проблем:-)

4
ответ дан Dan Lenski 29 November 2019 в 06:10
поделиться

Взгляните на мой ответ на .NET - Как можно разделить “caps” разграниченная строка на массив?

Редактирование: , Возможно, лучше для включения его здесь.

re.sub(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))', r'\1 ', text)

, Например:

"SimpleHTTPServer" => ["Simple", "HTTP", "Server"]
9
ответ дан Community 29 November 2019 в 06:10
поделиться

Я думаю, что 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()
0
ответ дан Brian 29 November 2019 в 06:10
поделиться

Я соглашаюсь, что regex решение является самым легким, но я не сказал бы, что это - большая часть pythonic.

Как насчет:

text = 'WordWordWord'
new_text = ''

for i, letter in enumerate(text):
    if i and letter.isupper():
        new_text += ' '

    new_text += letter
0
ответ дан Yaroslav Surzhikov 29 November 2019 в 06:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: