transforms a camelcase or pascalcase string to snakecase cameltosnakecasesomerandomstring somerandomstring cameltosnakecasesomerandomstrng somerandomstrng cameltosnakecase123somerandom123string123 123somerandom123string123 cameltosnakecase123somerandom123string123 123somerandom123string123 cameltosnakecase123 traceback most recent call last valueerror expected string as input found class int check for invalid input type if char is lowercase but proceeded by a digit if char is a digit proceeded by a letter if char is not alphanumeric remove leading underscore transforms a camelcase or pascalcase string to snake_case camel_to_snake_case somerandomstring some_random_string camel_to_snake_case somerandomstr ng some_random_str_ng camel_to_snake_case 123somerandom123string123 123_some_random_123_string_123 camel_to_snake_case 123somerandom123string123 123_some_random_123_string_123 camel_to_snake_case 123 traceback most recent call last valueerror expected string as input found class int check for invalid input type if char is lowercase but proceeded by a digit if char is a digit proceeded by a letter if char is not alphanumeric remove leading underscore
def camel_to_snake_case(input_str: str) -> str:
    

    
    if not isinstance(input_str, str):
        msg = f"Expected string as input, found {type(input_str)}"
        raise ValueError(msg)

    snake_str = ""

    for index, char in enumerate(input_str):
        if char.isupper():
            snake_str += "_" + char.lower()

        
        elif input_str[index - 1].isdigit() and char.islower():
            snake_str += "_" + char

        
        elif input_str[index - 1].isalpha() and char.isnumeric():
            snake_str += "_" + char.lower()

        
        elif not char.isalnum():
            snake_str += "_"

        else:
            snake_str += char

    
    if snake_str[0] == "_":
        snake_str = snake_str[1:]

    return snake_str


if __name__ == "__main__":
    from doctest import testmod

    testmod()