Нужна помощь с задачей 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"

Я бы сделал алгоритм по другому:

  1. разбить строку на слова, где слово начинается с большой буквы

  2. все слова перевести в нижний регистр

  3. соединить слова через "_"

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
→ Ссылка