не могу толком ревеснуть строку , что бы небуквенные символы оставались на своем месте

def reverse_string(st):
    rev_word = ''
    reverse_str = ''
    for letter in st:
        if letter.isalpha():
            rev_word = letter + rev_word
        else:
            reverse_str += rev_word
            rev_word = ''
            reverse_str += letter
    return reverse_str

print(reverse_string("b3ghcd hg#tyj%h"))

d3chgb hj#ytg%h


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

Автор решения: Denis Bruiaka

Смотри reserve вообще для списка.

Например:

mylist = [1, "res", 3]

mylist.reverse()
print(mylist)
→ Ссылка
Автор решения: Namerek

Если я правильно понял задачу то что-то такое можно рассмотреть:

string = "b3ghcd hg#1ty8j%h"
non_alpha_idx = [(i, string[i]) for i in range(len(string)) if not string[i].isalpha()]
reordered_symbols = [*filter(lambda x: x.isalpha(), string)][::-1]

while non_alpha_idx:
    index, symbol = non_alpha_idx.pop(0)
    reordered_symbols.insert(
        index,
        symbol
    )

print(''.join(reordered_symbols))
# h3jytg hd#1ch8g%b

Если переворачивать каждое слово отдельно, то просто нужно добавить еще один цикл:

string = "b3ghcd hg#tyj%h"

modified_parts = []

for part in string.split():

    non_alpha_idx = [(i, part[i]) for i in range(len(part)) if not part[i].isalpha()]
    reordered_symbols = [*filter(lambda x: x.isalpha(), part)][::-1]

    while non_alpha_idx:
        index, symbol = non_alpha_idx.pop(0)
        reordered_symbols.insert(
            index,
            symbol
        )

    modified_parts.append(''.join(reordered_symbols))

modified_string = ' '.join(modified_parts)
print(modified_string)
# d3chgb hj#ytg%h

Как Вы и хотели:

введите сюда описание изображения

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

еще вариант с регуляркой:

from re import finditer

s = "b3ghcd hg#tyj%h"
res = []
for i in s.split():
    rev = finditer('[A-Za-z]', i[::-1])
    res.append(''.join([next(rev)[0] if j.isalpha() else j for j in i]))

print(' '.join(res))
'''
d3chgb hj#ytg%h
→ Ссылка