我是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”
答案 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!