没有非字母符号的反向字符串

Reverse string without non letters symbol

我只需要反转每个单词中的字母。单词和非字母符号的顺序必须保持不变。我有一个功能,但是它改变了单词的位置。

def reverse_string(st):
    stack = []
    for el in st:
        if el.isalpha():
            stack.append(el)
    result = ''
    for el in st:
        if el.isalpha():
            result += stack.pop()
        else:
            result += el
    return result

输入字符串:

b3ghcd hg#tyj%h

预期输出字符串:

d3chgb hj#ytg%h

你们真的很亲密!您的代码不起作用,因为您将还原应用于整个字符串,而不是一次一个字地进行。但是只需添加一个额外的步骤,在空格处拆分输入字符串(我假设空格是输入中单词的定义)你会得到你想要的结果:

def reverse_string(st):
    return ' '.join(reverse_word(word) for word in st.split())

def reverse_word(st):
    stack = []
    for el in st:
        if el.isalpha():
            stack.append(el)
    result = ''
    for el in st:
        if el.isalpha():
            result += stack.pop()
        else:
            result += el
    return result

instr = 'b3ghcd hg#tyj%h'

print(reverse_string(instr)) # prints 'd3chgb hj#ytg%h'

注意: 您可以使用列表理解的一些内置函数对您的代码进行 Python 化处理。在这种情况下,您将替换 stack.

的建筑物
stack = []
    for el in st:
        if el.isalpha():
            stack.append(el)

对于以下其中一项:

stack = [el for el in st if el.isalpha()] 要么 stack = list(filter(str.isalpha, st))

使用您提供的函数,一种方法是:

import re

def reverse_word(st):
    stack = []
    for el in st:
        if el.isalpha():
            stack.append(el)
    result = ''
    for el in st:
        if el.isalpha():
            result += stack.pop()
        else:
            result += el
    return result

def reverse_string(st):
    return re.sub(r'\S+', lambda match: reverse_word(match.group()), st)

print(reverse_string("b3ghcd hg#tyj%h"))
# "d3chgb hj#ytg%h"

未经过彻底测试,您可能想使用 [^\s,.?!;] 或类似的东西而不是 \S,具体取决于您处理的 'sentences' 类型。

或者,您可以尝试以下操作,它仅创建字母字符的反向列表,然后将 non-alpha 字符插入到它们各自的位置,并将序列 returns 作为字符串插入。

def rev_str(s):
    x = list(filter(str.isalpha, s[::-1]))
    for i,s_ in enumerate(s):
        if not s_.isalpha():
            x.insert(i, s_)
    return ''.join(x)

instr = 'b3ghcd hg#tyj%h'
outstr = ' '.join(rev_str(s) for s in instr.split())

print(outstr)
d3chgb hj#ytg%h