2014-08-06 4 views
0

Я пытаюсь найти все прописные буквы в строке и заменить их строчным символом плюс underscore. AFAIK для достижения этой цели нет стандартной строковой функции (?)Замените прописные буквы строчными + дополнительными символами

. если входная строка 'OneWorldIsNotEnoughToLive' то строка вывода должна быть '_one_world_is_not_enough_to_live'

Я могу сделать это с помощью следующего фрагмента кода:

# This finds all the uppercase occurrences and split into a list 
import re 
split_caps = re.findall('[A-Z][^A-Z]*', name) 
fmt_name = '' 
for w in split_caps: 
    fmt_name += '_' + w # combine the entries with underscore 
fmt_name = fmt_name.lower() # Now change to lowercase 
print (fmt_name) 

Я думаю, что это слишком много. Сначала re, а затем итерация списка и, наконец, преобразование в нижний регистр. Возможно, есть более простой способ достичь этого, более питоновский и 1-2 строки.

Предлагайте лучшие решения. Благодарю.

+1

Это не кодовое письмо. Почему бы вам не взглянуть на [методы 'str'] (https://docs.python.org/2.7/library/stdtypes.html#string-methods). * «нет стандартной строковой функции» * - что вы ожидали, 'str.uppercase_to_lowercase_with_underscores'? – jonrsharpe

+0

Я знаю, что SO не является службой написания кода. Просто хотелось посмотреть, есть ли лучшие решения, более пифонические и 1-2 строки. – sk11

+0

Если вы хотите, чтобы рабочий код был рассмотрен, попробуйте http://codereview.stackexchange.com – jonrsharpe

ответ

5

Почему не простое регулярное выражение:

import re 
re.sub('([A-Z]{1})', r'_\1','OneWorldIsNotEnoughToLive').lower() 

# result '_one_world_is_not_enough_to_live' 
+1

Это заменит последовательные символы в верхнем регистре строчными символами, которым предшествует один символ подчеркивания. Это должно избежать этого '([A-Z] {1})' – se7entyse7en

+0

Да, это лучше. Я отредактирую ответ. Благодарю. –

+0

это неплохо, oneliner. – sk11

1

Попробуйте это.

string1 = "OneWorldIsNotEnoughToLive" 
list1 = list(string1) 
new_list = [] 
for i in list1: 
    if i.isupper(): 
     i = "_"+i.lower() 
    new_list.append(i) 
print ''.join(new_list) 

Output: _one_world_is_not_enough_to_live 
Смежные вопросы