没有非字母符号的反向字符串
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
我只需要反转每个单词中的字母。单词和非字母符号的顺序必须保持不变。我有一个功能,但是它改变了单词的位置。
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