在保持句子结构和标点符号的同时打乱单词的字符
Shuffle words' characters while maintaining sentence structure and punctuations
所以,我希望能够在句子中打乱单词,但是:
- 句子中的词序保持不变。
如果单词以大写字母开头,则拼凑的单词也必须以大写字母开头
(即首字母大写)。
标点符号。 , ; !和 ?需要保留。
例如,对于“我和汤姆在电影院看星球大战”这句话,
有趣!”一个混乱的版本将是“Mto nad I wachtde Tars Rswa ni het amecin, ti wsa
fnu!".
from random import shuffle
def shuffle_word(word):
word = list(word)
if word.title():
???? #then keep first capital letter in same position in word?
elif char == '!' or '.' or ',' or '?':
???? #then keep their position?
else:
shuffle(word)
return''.join(word)
L = input('try enter a sentence:').split()
print([shuffle_word(word) for word in L])
我可以理解如何混淆句子中的每个单词,但是...在 if 语句中挣扎以应用细节?请帮忙!
很高兴看到您已经理解了大部分逻辑。
要保持首字母大写,可以先检查一下,然后再将"new"首字母大写。
first_letter_is_cap = word[0].isupper()
shuffle(word)
if first_letter_is_cap:
# Re-capitalize first letter
word[0] = word[0].upper()
要保持尾随标点的位置,先去掉它,然后再添加回去:
last_char = word[-1]
if last_char in ".,;!?":
# Strip the punctuation
word = word[:-1]
shuffle(word)
if last_char in ".,;!?":
# Add it back
word.append(last_char)
这是我的代码。和你的逻辑有点不同。欢迎优化代码。
import random
def shuffle_word(words):
words_new = words.split(" ")
out=''
for word in words_new:
l = list(word)
if word.istitle():
result = ''.join(random.sample(word, len(word)))
out = out + ' ' + result.title()
elif any(i in word for i in ('!','.',',')):
result = ''.join(random.sample(word[:-1], len(word)-1))
out = out + ' ' + result+word[-1]
else:
result = ''.join(random.sample(word, len(word)))
out = out +' ' + result
return (out[1:])
L = "Tom and I watched Star Wars in the cinema, it was fun!"
print(shuffle_word(L))
以上代码执行的输出:
Mto nda I whaecdt Atsr Swra in hte ienamc, ti wsa nfu!
希望对您有所帮助。干杯!
由于这是一个字符串处理算法,我会考虑使用正则表达式。正则表达式为您提供了更大的灵活性、更清晰的代码,并且您可以摆脱边缘情况的条件。例如,这段代码可以处理撇号、数字、引号和日期和时间等特殊短语,无需任何额外代码,您只需更改正则表达式的模式即可控制这些。
from random import shuffle
import re
# Characters considered part of words
pattern = r"[A-Za-z']+"
# shuffle and lowercase word characters
def shuffle_word(word):
w = list(word)
shuffle(w)
return ''.join(w).lower()
# fucntion to shuffle word used in replace
def replace_func(match):
return shuffle_word(match.group())
def shuffle_str(str):
# replace words with their shuffled version
shuffled_str = re.sub(pattern, replace_func, str)
# find original uppercase letters
uppercase_letters = re.finditer(r"[A-Z]", str)
# make new characters in uppercase positions uppercase
char_list = list(shuffled_str)
for match in uppercase_letters:
uppercase_index = match.start()
char_list[uppercase_index] = char_list[uppercase_index].upper()
return ''.join(char_list)
print(shuffle_str('''Tom and I watched "Star Wars" in the cinema's new 3D theater yesterday at 8:00pm, it was fun!'''))
这适用于任何句子,即使是连续 "special" 个字符,保留所有标点符号:
from random import sample
def shuffle_word(sentence):
new_sentence=""
word=""
for i,char in enumerate(sentence+' '):
if char.isalpha():
word+=char
else:
if word:
if len(word)==1:
new_sentence+=word
else:
new_word=''.join(sample(word,len(word)))
if word==word.title():
new_sentence+=new_word.title()
else:
new_sentence+=new_word
word=""
new_sentence+=char
return new_sentence
text="Tom and I watched Star Wars in the cinema, it was... fun!"
print(shuffle_word(text))
输出:
Mto nda I hctawed Rast Aswr in the animec, ti asw... fnu!
所以,我希望能够在句子中打乱单词,但是:
- 句子中的词序保持不变。
如果单词以大写字母开头,则拼凑的单词也必须以大写字母开头 (即首字母大写)。
标点符号。 , ; !和 ?需要保留。
例如,对于“我和汤姆在电影院看星球大战”这句话, 有趣!”一个混乱的版本将是“Mto nad I wachtde Tars Rswa ni het amecin, ti wsa fnu!".
from random import shuffle
def shuffle_word(word):
word = list(word)
if word.title():
???? #then keep first capital letter in same position in word?
elif char == '!' or '.' or ',' or '?':
???? #then keep their position?
else:
shuffle(word)
return''.join(word)
L = input('try enter a sentence:').split()
print([shuffle_word(word) for word in L])
我可以理解如何混淆句子中的每个单词,但是...在 if 语句中挣扎以应用细节?请帮忙!
很高兴看到您已经理解了大部分逻辑。
要保持首字母大写,可以先检查一下,然后再将"new"首字母大写。
first_letter_is_cap = word[0].isupper()
shuffle(word)
if first_letter_is_cap:
# Re-capitalize first letter
word[0] = word[0].upper()
要保持尾随标点的位置,先去掉它,然后再添加回去:
last_char = word[-1]
if last_char in ".,;!?":
# Strip the punctuation
word = word[:-1]
shuffle(word)
if last_char in ".,;!?":
# Add it back
word.append(last_char)
这是我的代码。和你的逻辑有点不同。欢迎优化代码。
import random
def shuffle_word(words):
words_new = words.split(" ")
out=''
for word in words_new:
l = list(word)
if word.istitle():
result = ''.join(random.sample(word, len(word)))
out = out + ' ' + result.title()
elif any(i in word for i in ('!','.',',')):
result = ''.join(random.sample(word[:-1], len(word)-1))
out = out + ' ' + result+word[-1]
else:
result = ''.join(random.sample(word, len(word)))
out = out +' ' + result
return (out[1:])
L = "Tom and I watched Star Wars in the cinema, it was fun!"
print(shuffle_word(L))
以上代码执行的输出:
Mto nda I whaecdt Atsr Swra in hte ienamc, ti wsa nfu!
希望对您有所帮助。干杯!
由于这是一个字符串处理算法,我会考虑使用正则表达式。正则表达式为您提供了更大的灵活性、更清晰的代码,并且您可以摆脱边缘情况的条件。例如,这段代码可以处理撇号、数字、引号和日期和时间等特殊短语,无需任何额外代码,您只需更改正则表达式的模式即可控制这些。
from random import shuffle
import re
# Characters considered part of words
pattern = r"[A-Za-z']+"
# shuffle and lowercase word characters
def shuffle_word(word):
w = list(word)
shuffle(w)
return ''.join(w).lower()
# fucntion to shuffle word used in replace
def replace_func(match):
return shuffle_word(match.group())
def shuffle_str(str):
# replace words with their shuffled version
shuffled_str = re.sub(pattern, replace_func, str)
# find original uppercase letters
uppercase_letters = re.finditer(r"[A-Z]", str)
# make new characters in uppercase positions uppercase
char_list = list(shuffled_str)
for match in uppercase_letters:
uppercase_index = match.start()
char_list[uppercase_index] = char_list[uppercase_index].upper()
return ''.join(char_list)
print(shuffle_str('''Tom and I watched "Star Wars" in the cinema's new 3D theater yesterday at 8:00pm, it was fun!'''))
这适用于任何句子,即使是连续 "special" 个字符,保留所有标点符号:
from random import sample
def shuffle_word(sentence):
new_sentence=""
word=""
for i,char in enumerate(sentence+' '):
if char.isalpha():
word+=char
else:
if word:
if len(word)==1:
new_sentence+=word
else:
new_word=''.join(sample(word,len(word)))
if word==word.title():
new_sentence+=new_word.title()
else:
new_sentence+=new_word
word=""
new_sentence+=char
return new_sentence
text="Tom and I watched Star Wars in the cinema, it was... fun!"
print(shuffle_word(text))
输出:
Mto nda I hctawed Rast Aswr in the animec, ti asw... fnu!