在保持句子结构和标点符号的同时打乱单词的字符

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!