2016-04-21 2 views
-2
 for n in range(0, len(plaintext)): 
      if plaintext[n] == ' ': 
       new = ord(plaintext[n]) 
      else: 
       new = ord(plaintext[n]) + ord(key[n%len(key)]) - 65 
       if new > 90: 

Так что я хочу знать, как я могу убедиться, что все знаки препинания не зашифрованы, а только буквы зашифрованы? Я знаю, что это не лучший способ зашифровать, но это для школьного проекта, поэтому было бы здорово, если бы кто-то мог мне помочь. Также, когда я расшифровываю его, он не расшифровывается должным образом, а иногда забывает полные остановки и прочее, как я могу это исправить? Благодарю.Как я могу убедиться, что все знаки препинания не зашифрованы?

+0

Лучше разделить его на 2 вопроса. Первый может быть связан с регулярным выражением –

ответ

3

Определите все знаки препинания;

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, '.')] 
+0

. Он не работает – Shoaib

+0

Это не очень информативно. Можете ли вы изменить свой вопрос и добавить пример ввода/вывода? –

+0

как я могу позволить ему не делать апострофы (')? – Shoaib

Смежные вопросы