Вырезать часть строки по разделителю

На вход программе подается строка текста, в которой буква «h» встречается минимум два раза. Как удалить из этой строки первое и последнее вхождение буквы «h», а также все символы, находящиеся между ними?

Я сделала вот так:

s = input()
total = 0
for i in s:
    total += s.count(i)
print(total)
#или print max(total)

но я не понимаю как сделать, чтобы для каждого символа создавался счетчик Я не смогла решить эту задачу, помогите пожалуйста!


Ответы (2 шт):

Автор решения: Jack_oS

Можно найти индексы символа 'h' в исходной строке:

sep_indexes = [pos for pos, char in enumerate(text) if char == separator]

и соединить то, что перед первым 'h' с тем, что после последнего 'h':

begin = text[:sep_indexes[0]]
end = text[sep_indexes[-1]+1:]

result = begin + end

Все вместе:

def cut_text(text, separator):
    sep_indexes = [pos for pos, char in enumerate(text) if char == separator]

    begin = text[:sep_indexes[0]]
    end = text[sep_indexes[-1]+1:]

    return begin + end

text = 'foohbarhspam'
separator = 'h'

new_text = cut_text(text, separator)
print(new_text)

напечатает foospam

→ Ссылка
Автор решения: Stanislav Volodarskiy

Можно найти первое (text.find('h')) и последнее (text.rfind('h')) вхождение символа h в строку. Затем отрезать от строки начало до первого символа и конец после последнего. Склеить их:

text = input()

#             первая 'h'            последняя 'h'
#           --------------         ---------------
print(text[:text.find('h')] + text[text.rfind('h') + 1:])
#     ---------------------   --------------------------
#     начало текста до 'h'      конец текста после 'h'

Более изощрённое решение - регулярное выражение h.*h. Символы h сопоставятся сами с собой в строке. .* - означает "любое количество любых символов".

Регулярные выражения жадные: они ищут самый длинный фрагмент для сопоставления. Это значит что первая h в выражении сопоставится с первым вхождением буквы h в строке, последняя h в выражении - с последней h в строке.

re.sub заменяет найденное сопоставление на второй свой аргумент. Второй аргумент - пустая строка, то есть мы выбрасываем то что нашли:

import re

text = input()

print(re.sub('h.*h', '', text))

Оба варианта работают одинаково (если в строке есть хотя бы две h):

'1h2h3h4' -> '14'

→ Ссылка