Определите все знаки препинания;
punctuation = " ',.;:.!?\r\n"
Заменить все экземпляры
if plaintext[n] == ' ':
по
if plaintext[n] in punctuation:
Добавление
Хотя ваш код является функциональным, он не использует много из мощные инструменты tha t Python в вашем распоряжении. Позвольте мне проиллюстрировать. Шифрование/дешифрование (с пунктуацией, удаленной из текста) можно было бы сделать так, используя списки;
In [42]: plaintext = 'THISISAPLAINTEXT' # Your algorithm only works for capitals.
In [43]: key = 'SPAMEGGS'
In [44]: count = int(len(plaintext)/len(key))+1
In [45]: stretchedkey = [ord(c) for c in key*count]
In [46]: # Encryption
In [47]: plainnum = [ord(c) for c in plaintext]
In [48]: ciphernum = [a+b-65 for a, b in zip(plainnum, stretchedkey)]
In [49]: ciphertext = ''.join([chr(c) if c <= 90 else chr(c-26) for c in ciphernum])
In [50]: ciphertext
Out[50]: 'LWIEMYGHDPIZXKDL'
In [51]: # Decryption
In [52]: ciphernum = [ord(c) for c in ciphertext]
In [53]: decryptnum = [a-b+65 for a, b in zip(ciphernum, stretchedkey)]
In [54]: decrypt = ''.join([chr(c) if c >= 65 else chr(c+26) for c in decryptnum])
In [55]: decrypt
Out[55]: 'THISISAPLAINTEXT'
Некоторые объяснения.
Понимание списка может преобразовывать строку в список строк символов;
In [69]: [c for c in 'THISISATEXT']
Out[69]: ['T', 'H', 'I', 'S', 'I', 'S', 'A', 'T', 'E', 'X', 'T']
Или к списку значений символов;
In [70]: [ord(c) for c in 'THISISATEXT']
Out[70]: [84, 72, 73, 83, 73, 83, 65, 84, 69, 88, 84]
Вы можете даже лишить пунктуацию, пока вы это делаете.
In [80]: [c for c in 'THIS IS A TEXT.' if c not in ' .']
Out[80]: ['T', 'H', 'I', 'S', 'I', 'S', 'A', 'T', 'E', 'X', 'T']
zip
встроенный позволяет перебирать комбинации списков;
In [73]: p = [ord(c) for c in 'THISISATEXT']
In [74]: q = [ord(c) for c in 'SPAMEGGSSPAMEGGS']
In [77]: p
Out[77]: [84, 72, 73, 83, 73, 83, 65, 84, 69, 88, 84]
In [78]: q
Out[78]: [83, 80, 65, 77, 69, 71, 71, 83, 83, 80, 65, 77, 69, 71, 71, 83]
In [79]: [a+b for a, b in zip(p, q)]
Out[79]: [167, 152, 138, 160, 142, 154, 136, 167, 152, 168, 149]
Подсказка:
Составьте список всех знаков препинания в строке, с индексом.
In [82]: [(n, c) for n, c in enumerate('THIS IS A TEXT.') if c in ' .']
Out[82]: [(4, ' '), (7, ' '), (9, ' '), (14, '.')]
Лучше разделить его на 2 вопроса. Первый может быть связан с регулярным выражением –