反转 Python 字符串中的单词(包括标点符号)

Posted

技术标签:

【中文标题】反转 Python 字符串中的单词(包括标点符号)【英文标题】:Reversing words in a Python string (including punctuation) 【发布时间】:2017-04-03 14:02:10 【问题描述】:

我在这里写了一个程序来反转给定句子中的单词:

def rev_each_word_in(Sentence):

print(' '.join(Word[::-1] for Word in Sentence.split()))

作为我对 Sentence 的输入,我曾经“成为或不成为那是个问题”。这将返回以下内容:

ot eb ro ton ot eb taht si eht .noitseuq

这几乎正是我想要的,但是有没有办法让句号保留在句末,所以返回是:

ot eb ro ton ot eb taht si eht noitseuq.

提前谢谢你!

【问题讨论】:

所以你想让“don't”变成“tno'd”? 您是否希望所有标点符号都保持在同一位置? 【参考方案1】:

可以将函数作为repl 参数传递给re.sub(),因此我们可以使用它来匹配单词并反转它们:

import re

def rev_each_word_in(sentence):
    return re.sub(r'\b\S*\b', lambda m: m.group(0)[::-1], sentence)

模式\b\S*\b 匹配单词边界,后跟任意数量的非空白字符,然后是单词边界。

函数(一个 lambda,为简洁起见)为每个匹配项获取 group(0)(匹配项的完整文本),并使用切片以通常的方式反转它。

例子:

>>> rev_each_word_in('to be or not to be that is the question.')
'ot eb ro ton ot eb taht si eht noitseuq.'

>>> rev_each_word_in("whether 'tis nobler in the mind to suffer")
"rehtehw 'sit relbon ni eht dnim ot reffus"

>>> rev_each_word_in("aye, there's the rub")
"eya, s'ereht eht bur"

如您所见,这会保留紧挨单词之前或之后的标点符号位置,同时将其保持在每个反转单词内的“正确”位置。

【讨论】:

【参考方案2】:

这里有一些丑陋的东西可以用一行来解决这个问题:

from string import punctuation as p
print(' '.join(w[::-1] if w[-1] not in p else w[:-1][::-1] + w[-1] for w in Sentence.split()))

如果单词中的最后一个字符不在标点字符串中,我们将完全反转,如果是,我们将字符串反转直到标点符号,然后将标点符号添加到它。打印出来:

ot eb ro ton ot eb taht si eht noitseuq.

因为我感到羞耻,所以我尽可能地瘦下来:

# similar to  [::-1]
r = slice(None, None,-1)
# cut down chars!    
l = Sentence.split()
# reverse condition too and use shorter names
print(' '.join(w[:-1][r] + w[-1] if w[-1] in p else w[r] for w in l))

【讨论】:

【参考方案3】:

您的规范仍不清楚,但如果您只想在一个单词中反转字母,也许您可​​以尝试类似

def reverse_letters(word):
    lets = (c for c in reversed(word) if c.isalpha())
    return ''.join([c if not c.isalpha() else next(lets)
                    for c in word])

def reverse_sentence(sentence):
    words = sentence.split()
    return ' '.join([reverse_letters(word) for word in words])

这给了我

In [23]: reverse_sentence("to be or not to be, that is the question.")
Out[23]: 'ot eb ro ton ot eb, taht si eht noitseuq.'

In [24]: reverse_sentence("Don't try this at home!")
Out[24]: "tno'D yrt siht ta emoh!"

【讨论】:

不错! (至少,如果你正确解释了 OP 想要什么......)【参考方案4】:
import string

def reverse(sentence):
    punctuation = set(string.punctuation)
    words = []
    for word in sentence.split():
        words.append(word.rstrip(string.punctuation)[::-1])
        if word[-1] in punctuation:
           words[-1] = words[-1]+word[-1]
    return ' '.join(words)

输出:

In [152]: reverse("to be or not to be that is the question.")
Out[152]: 'ot eb ro ton ot eb taht si eht noitseuq.'

这适用于您句子中的任何标点符号:

In [153]: reverse("to be or not to be; that is the question.")
Out[153]: 'ot eb ro ton ot eb; taht si eht noitseuq.'

【讨论】:

【参考方案5】:

把你的方法改成这样:

def rev_each_word_in(Sentence):
    if Sentence[-1] == '.':
        Sentence = Sentence[:-1]
        print(' '.join(Word[::-1] for Word in Sentence.split())+".")
    else:
        print(' '.join(Word[::-1] for Word in Sentence.split()))

【讨论】:

这仅适用于句末的单个句点。 正确。这似乎是 OP 想要的。

以上是关于反转 Python 字符串中的单词(包括标点符号)的主要内容,如果未能解决你的问题,请参考以下文章

使用Python反转字符串中的单词[关闭]

C语言实现来实现字符串反转,只有单词顺序反转,组成单词的字母不反转

C语言实现字符串单词反转

LintCode 53. 翻转字符串

华为OD机试 - 单词反转(JavaScript) | 机试题算法思路 2023

leetcode python翻转字符串里的单词