使用python反转句子中的每个单词

时间:2019-04-18 15:00:48

标签: python

我是python的新手。我正在尝试反转句子中的每个单词。我为此编写了以下代码,并且工作正常。

我的代码: [来自答案]

import re
str = "I am Mike!"

def reverse_word(matchobj):
    return matchobj.group(1)[::-1]

res = re.sub(r"([A-Za-z]+)", reverse_word, str)
print(res)

但是我想在此添加一个条件。.仅单词不应该反转任何符号。[字母数字单词和包含连字符的单词除外]

已更新##

样本: 输入:“我是迈克!and123我的年龄是12岁”

当前输出:“ I ma ekiM!dna123 ym-ega si 12”

必填输出:“我叫ekiM!321dna ege-ym si 21”

3 个答案:

答案 0 :(得分:1)

正则表达式:([A-Za-z]+)

您可以使用字符类[A-Za-z]来检查任何一个或多个长度的单词,捕获它,然后使用re.sub函数使用一个函数反转第1组。

import re
str = "I am Mike!"

def reverse_word(matchobj):
    return matchobj.group(1)[::-1]

res = re.sub(r"([A-Za-z]+)", reverse_word, str)
print(res)

输出:

'I ma ekiM!'

更新

您可以tweak the code一点点来达到您的结果:

import re
str = "I am Mike! and123 my-age is 12"

def reverse_word(matchobj):
     hyphen_word_pattern = r"([A-Za-z]+)\-([A-Za-z]+)"
     match = re.search(hyphen_word_pattern, matchobj.group(1))
     if match:
         return re.sub(hyphen_word_pattern, f"{match.group(2)[::-1]}-{match.group(1)[::-1]}", match.group(0))
     else:
         return matchobj.group(1)[::-1]

res = re.sub(r"([A-Za-z]+\-?[A-Za-z]+)", reverse_word, str)
print(res)

输出:

I ma ekiM! dna123 ega-ym si 12

答案 1 :(得分:1)

完全不用re

def reverse_words_in_string(string):
    spl = string.split()
    for i, word in enumerate(spl):
        spl[i] = word[::-1]
    return ' '.join(spl)

给予 “我可能会!ekiM 321dna ega-ym si 21”

答案 2 :(得分:0)

一种可行的方法是对单词列表进行额外的迭代,并使用re.sub将可选的前导标点符号移回到现在反转的单词的末尾:

s = "I am Mike!"
split_s = s.split()
r_word = [word[::-1] for word in split_s]
r_word = [re.sub(r'^([^\s\w])(.*)$', '\\2\\1', i) for i in r_word]
new_s = " ".join(r_word)
print(new_s)

I ma ekiM!