Нужна помощь с задачей Python
Напишите функцию convert_to_python_case(text), которая принимает в качестве аргумента строку в «верблюжьем регистре» и преобразует его в «змеиный регистр».
print(convert_to_python_case('ThisIsCamelCased'))
print(convert_to_python_case('IsPrimeNumber'))
должен выводить:
this_is_camel_cased
is_prime_number
код не проходит один тест
def convert_to_pythom_case(text):
a = text[0].lower()
for _ in text:
if _ == _.lower():
a += _
elif _ == _.upper() and _ != text[0]:
a += "_" + _.lower()
return a
s = input()
print(convert_to_pythom_case(s))
при вводе MyMethodThatDoSomething
выдает myethod_that_do_something
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
у вас ошибка в этой строке:
elif _ == _.upper() and _ != text[0]:
если первая буква равна другой большой букве, то большая буква будет пропущена, как у вас и случилось
например "MMMMMMM" ваш алгоритм превратит в "m"
Я бы сделал алгоритм по другому:
разбить строку на слова, где слово начинается с большой буквы
все слова перевести в нижний регистр
соединить слова через "_"
def convert_to_pythom_case(text):
words = []
tmp = ""
for l in text:
if l.isupper():
if tmp:
words.append(tmp)
tmp = ""
tmp += l
if tmp:
words.append(tmp)
res = '_'.join(map(str.lower, words))
return res
print(convert_to_pythom_case("MyMethodThatDoSomething"))
Автор решения: Алексей Р
→ Ссылка
Решение с использованием регулярных выражений
import re
def convert_to_pythom_case(text):
return re.sub('([A-Z][a-z]*)', r'\1_', text).lower().rstrip('_')
for w in 'MyMethodThatDoSomething', 'ThisIsCamelCased', 'AAAA', 'AAbbCCdd':
print(convert_to_pythom_case(w))
my_method_that_do_something
this_is_camel_cased
a_a_a_a
a_abb_c_cdd