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

Рейтинг: -3Ответов: 2Опубликовано: 14.04.2023

Задача: Дана строка s из комбинации латинских строчных букв, пробелов и точек. Напишите функцию capital(s), которая меняет каждую первую строчную букву после точки на заглавную. Попытка:

def capital(s):
    s_list = s.split('.')
    capital_list = []
    for word in s_list:
        if len(word) > 0 and word[0].isalpha() and word[0].lower() == word[0]:
            capital_word = word[0].upper() + word[1:]
            capital_list.append(capital_word)
        else:
            capital_list.append(word)
    for i in range(1, len(capital_list)):
        capital_list[i] = '.' + capital_list[i]
    return ''.join(capital_list)

Когда пытаюсь вывести получаю это: Тест не пройден. При передаче в функцию hello. world. правильный ответ hello. World., у вас Hello. world.. Помогите как исправить эту ошибку

Ответы

▲ 1

Идеальным решением будет однострочник с использованием регулярного выражения:

import re
def capital(s):
    return re.sub(r"(?<=\.)\s*\w", lambda m: m.group(0).upper(), s)

Решением попроще будет использовать флаг обнаружения точки и, в случае если он равен True, то изменять следующую встретившуюся букву на заглавную:

def capital(text):
    flag = False
    result_text = ""
    for letter in text:
        if letter == ".":
            flag = True
        elif flag and letter.isalnum():
            letter = letter.upper()
            flag = False
        result_text += letter
    return result_text
▲ 0

Дело в том, что вы рассматрвиаете только первый символ после точки, а требуется найти первую букву после точки, это немного разные условия. Также вы рассматриваете первое слово перед точкой, чего не следует делать по заданию. Вот правильный код:

# Функция возвращает индекс символа в строке, являющегося первой строчной буквой
# Либо -1, если первая буква не строчная или строчных букв не найдено
def find_first_lowercase(s):
    for index, symbol in enumerate(s):  # Перебираем индексы и символы строки
        if not symbol.isalpha():  # Если символ не из алфавита - пропускаем
            continue
        if symbol.islower():  # Если первая буква - строчная, то возвращаем её индекс
            return index
        return -1  # Если первая буква в слове - прописная, то возвращаем -1
    return -1


def capital(s):
    s_list = s.split('.')
    capital_list = [s_list[0]]  # Изменять слово до точки не требуется
    for word in s_list[1:]:
        first_lowercase_idx = find_first_lowercase(word)  # Находим нужный индекс
        if first_lowercase_idx == -1:  # Если такой буквы не нашлось - продолжаем без изменений
            capital_list.append(word)
            continue

        # Получаем букву по индексу
        first_lowercase_letter = word[first_lowercase_idx]
        # Т.к. нельзя напрямую изменять строку, сначала конвертируем в список
        l_word = list(word)
        # Изменяем значение в списке
        l_word[first_lowercase_idx] = first_lowercase_letter.upper()

        capital_word = ''.join(l_word)  # Переводим список обратно в строку
        capital_list.append(capital_word)  # Добавляем в ответ

    return '.'.join(capital_list)  # Разделяем через точки


print(capital("hello. world. "))
# hello. World.