2016-08-10 3 views
-3

姓の各文字をアルファベットの連続する文字で置き換えるにはどうすればよいですか?私はマスキングツールとしてこのスクリプトが必要です。姓のため姓の各文字をアルファベットの連続する文字で置き換えます。

ロジック:(Bの変更、Cに対するBの変更、...、へのZの変化)

例:ジョン・ドウになるであろうジョンEPF

入力ファイル:names.txt

John yi 
kary Strong 
Joe Piazza 
So man 

答えて

0

あなたの質問に定義されている問題が解決することができます:ここでは

parts = name.split() 
parts[1]=''.join([chr((ord(c) - 65 + 1) % 26 + 65) 
        if ord(c) < 91 else 
        chr((ord(c) - 97 + 1) % 26 + 97) 
        for c in parts[1]]) 
' '.join(parts) 

、私は文字列の2番目の単語として最後の名前を定義し、もちろんこれは強い仮定であるが、上の向上しますこれは問題の主要な問題ではありません。

文字をシフトすることはリスト内で行われ、各文字は別々に処理され、最初にordを使用してASCIIコードに変換されます。大文字のASCIIコードは65-90(A - Z)で、小文字のASCIIコードは97-122(a - z)です。したがって、ケースを分離するために条件ord(c) < 91が使用されます。次に、ASCIIコードは0から25の範囲の値に変換され、シフトされます(この例では1ずつ増分されます)。% 26のモジュロ演算を使用して、zaに戻します。その結果の値は、ASCII ASCIIコードの適切な範囲に変換されます。

+0

これはzに影響しますか? – user357269

+0

いいえ、ただし、これは大文字と小文字の区別です。 –

+0

このコードは問題の解決に役立つかもしれませんが、_why_および/または_how_が質問に答えているとは説明していません。この追加の文脈を提供することは、長期的な価値を大幅に改善することになる。どのような制限や仮定が適用されるかなど、あなたの答えを解説してください。 –

1

これはCaesar's cipherと呼ばれます。あなたはそれが少しだけでなく、大文字の文字を許可するように変更する必要がありますhttps://stackoverflow.com/a/8895517/6664393

:1でシフトする

def caesar(plaintext, shift): 
    alphabet_lower = string.ascii_lowercase 
    alphabet_upper = string.ascii_uppercase 
    alphabet = alphabet_lower + alphabet_upper 
    shifted_alphabet_lower = alphabet_lower[shift:] + alphabet_lower[:shift] 
    shifted_alphabet_upper = alphabet_upper[shift:] + alphabet_upper[:shift] 
    shifted_alphabet = shifted_alphabet_lower + shifted_alphabet_upper 
    table = string.maketrans(alphabet, shifted_alphabet) 
return plaintext.translate(table) 

使用shift = 1

は、それがここで行うのかを見てみましょう。次のように

関連する問題