Заглавная буква после восклицательного знака - PullRequest
2 голосов
/ 30 июня 2019

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

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

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 .

Ответы [ 4 ]

5 голосов
/ 30 июня 2019

Что по этому поводу:

string = "hello! there!"
'! '.join(map(lambda s: s.lstrip().capitalize(), string.split('!')))
2 голосов
/ 30 июня 2019

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

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

strin = "hello! there!" 

strout = <b>list(strin[:2])</b>
for i in range(<b>2</b>, 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 голосов
/ 30 июня 2019

простым решением было бы использование заглавных букв, только если 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)
0 голосов
/ 30 июня 2019

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

string = 'Hello! world'

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

print(capitalize)
...