Замена каждой первой строчной буквы после точки на заглавную
Задача: Дана строка 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.. Помогите как исправить эту ошибку
Ответы (2 шт):
Идеальным решением будет однострочник с использованием регулярного выражения:
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
Дело в том, что вы рассматрвиаете только первый символ после точки, а требуется найти первую букву после точки, это немного разные условия. Также вы рассматриваете первое слово перед точкой, чего не следует делать по заданию. Вот правильный код:
# Функция возвращает индекс символа в строке, являющегося первой строчной буквой
# Либо -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.