Как заменить прописные буквы подчеркиванием? - PullRequest
9 голосов
/ 06 сентября 2011

Я новичок в Python и пытаюсь заменить все прописные буквы в слове на подчеркивание, например:

ThisIsAGoodExample

должно стать

this_is_a_good_example

Есть идеи / советы / ссылки / учебные пособия о том, как этого добиться?

Ответы [ 6 ]

10 голосов
/ 06 сентября 2011

Вот способ регулярного выражения:

import re
example = "ThisIsAGoodExample"
print re.sub( '(?<!^)(?=[A-Z])', '_', example ).lower()

Это говорит: «Найдите в строке точки, которые не предшествуют началом строки, а - это , за которым следует символ верхнего регистра, и подставьте знак подчеркивания. Затем мы опускаем () регистр целиком.

8 голосов
/ 06 сентября 2011
import re
"_".join(l.lower() for l in re.findall('[A-Z][^A-Z]*', 'ThisIsAGoodExample'))

EDIT: На самом деле, это работает, только если первая буква прописная. В противном случае это (взято из здесь ) делает правильную вещь:

def convert(name):
    s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
5 голосов
/ 07 сентября 2011

Создает список элементов, где каждый элемент представляет собой «_», за которым следует буква в нижнем регистре, если символ изначально был заглавной буквой, или сам символ, если это не так.Затем он объединяет их в строку и удаляет все начальные подчеркивания, которые могли быть добавлены процессом:

print ''.join('_' + char.lower() if char.isupper() else char
              for char in inputstring).lstrip('_')

Кстати, вы не указали, что делать с подчеркиваниями, которые уже присутствуют в строке,Я не был уверен, как справиться с этим делом, поэтому я наказал.

2 голосов
/ 06 сентября 2011
example = 'ThisIsAGoodExample'
# Don't put an underscore before first character.
new_example = example[0].lower()
for character in example[1:]:
    # Append an underscore if the character is uppercase.
    if character.isupper():
        new_example += '_'
    new_example += character.lower()
1 голос
/ 07 сентября 2011

Поскольку никто другой не предложил решение с использованием генератора, вот одно из них:

0 голосов
/ 06 сентября 2011

Анализируйте строку, каждый раз, когда вы встречаете заглавную букву, вставьте перед ней символ _, а затем переключите найденный символ на нижний регистр

...