Вырезать часть строки по разделителю
На вход программе подается строка текста, в которой буква «h» встречается минимум два раза. Как удалить из этой строки первое и последнее вхождение буквы «h», а также все символы, находящиеся между ними?
Я сделала вот так:
s = input()
total = 0
for i in s:
total += s.count(i)
print(total)
#или print max(total)
но я не понимаю как сделать, чтобы для каждого символа создавался счетчик Я не смогла решить эту задачу, помогите пожалуйста!
Ответы (2 шт):
Можно найти индексы символа '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
Можно найти первое (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'