У меня есть строка, которая должна начинаться с заглавной буквы после "!":

Я создал скрипт, который работает в определенной степени, но вызывает проблемы, когда последняя буква - «!».

strin "hello! there!" 

strout = []

for i in range(len(strin)):     
    if strin[i-2] == '!':
        strout.append((strin[i]).capitalize())

    else:
        strout.append(strin[i])
    strout[0] = strout[0].capitalize()

newStr = "".join(strout)

Вывод: Привет! Там!


Что я могу сделать, чтобы вторая буква не была заглавной?
Причина [i-2] в том, что когда цикл встречает '!' в середине текста заглавная буква i .

2
vectorizinglife 30 Июн 2019 в 17:48

4 ответа

Лучший ответ

Простое решение - использовать заглавные буквы, только если i-2 >= 0.

Попробуй это:

strin = "hello! there!"

strout = []

for i in range(len(strin)):
    if i-2>=0 and strin[i-2] == '!':
        strout.append((strin[i]).capitalize())
    else:
        strout.append(strin[i])
strout[0] = strout[0].capitalize()

newStr = "".join(strout)

print(newStr)
2
Adam.Er8 30 Июн 2019 в 14:52

Я использовал lstrip (), если перед символом есть пробел или пробелы, которые вы хотите использовать для своей выгоды.

string = 'Hello! world'

capitalize = string.split('!')[1].lstrip().capitalize()  # replace .capitalize() with .upper to cap all letters

print(capitalize)
0
probat 30 Июн 2019 в 15:03

Если i равен нулю или единице, то i-2 будет отображаться в -2 и -1 соответственно. В Python -1 означает последний элемент. Так что он будет E с большой буквы, как вы заметили.

Возможно, имеет смысл начать с индекса 2:

strin = "hello! there!" 

strout = list(strin[:2])
for i in range(2, len(strin)):
    if strin[i-2] == '!':
        strout.append(strin[i].capitalize())
    else:
        strout.append(strin[i])
strout[0] = strout[0].capitalize()
result = ''.join(strout)

При этом использование регулярного выражения, вероятно, более декларативно:

from re import compile as recompile

rgx = recompile(r'(?:[!]\s*|^)[a-z]')

outp = rgx.sub(lambda m: m.group(0).upper(), strin)

Это будет с заглавной буквы первого символа, а также всех символов после восклицательного знака, независимо от количества пробелов между ними.

2
Willem Van Onsem 30 Июн 2019 в 15:08

Как насчет этого:

string = "hello! there!"
'! '.join(map(lambda s: s.lstrip().capitalize(), string.split('!')))
5
Cedric H. 30 Июн 2019 в 14:52