2016-07-28 8 views
1

私はパスワードジェネレータを書いて、この厄介な問題に遭遇しました。同じ行に数字や文字を繰り返しています。ユーザは、パスワードをどのように生成するかの形式をプログラムに与えます。ex "C @@ d %%%" ここで、@は文字のみで、%は数字だけです。また、ユーザは数字と文字を入力して生成しますパスワードは、プログラムはcold123のようなものを出力すると思われますが、代わりにcood111またはclld111を出力します。下のコードのスニペットを投稿しますが、口を悪くしないでください。私はかなり新しいです。 、独学で、数カ月間、Pythonの経験をお楽しみください。プログラムで同じキーが生成されないようにするにはどうすればよいですか?

class G() 
    . 
    . 
    . 

    # self.forms is the format the user input they can input things such as [email protected]@d%%% 
    # where @ is only letters and where % is only numbers 

    # self.Bank is a list where generated things go 

    AlphaB = [] #list Of All Of The Positions That have The @ sign in The self.forms 
    NumB = [] #list of All of the positions that have a % sign 
    for char in self.forms: 
     if char == '@': 
      EOL=(self.Position) # Positions End Of Line 
      Loc = self.forms[EOL] # Letter 
      AlphaB.append(EOL) 


     if char == '%': 
      EOL=(self.Position) 
      Loc = self.forms[EOL] 
      NumB.append(EOL) 
     self.Position+=1 # Move right a position 

    for pos in AlphaB: 
     for letter in self.alphas: #letters in The User Inputs 
      GenPass=(self.forms.replace(self.forms[pos],letter)) 
      #Not Fully Formatted yet, because Only The letter been formatted 
      if GenPass.find('%'): 
       for Pos in NumB: 
        for number in self.ints: 
         GenPass=(GenPass.replace(GenPass[Pos],number)) 
         if GenPass not in self.Bank: 
          #Cood111 
          print (GenPass) 
          self.Bank.append(GenPass) 

      else: 
       if GenPass not in self.Bank: 
        print (GenPass) 
        self.Bank.append(GenPass) 
+1

これは実習ですよね?生産コードに入っていませんか? – l0b0

+0

問題は 'replace()'関数です3番目の引数 '、1'を渡すと、最初のオカレンスだけがすべて置換され、 – depperm

答えて

0

GenPass.replace(GenPass[Pos],number)numberの値でGenPass[Pos]にある文字のすべての発生を置き換えられます。あなたは一度に1文字を置き換えることを確認する必要があります。

+0

の代わりに1つずつ置換されて3番目の引数が追加されます'GenPass.replace(GenPass [Pos]、number、1)'のようなものに 'replace'して、最初のものだけを置き換えます – depperm

+0

どのように?置き換えられるものはすべて – user5117999

+0

と置き換えられますので、基本的にはGenPass.replace(GenPass [Pos]、number、int(Pos)) – user5117999

0

すべての文字とすべてのnumのリストを作成し、list.pop(randint(0、len(list) - 1)を使用して1つを選択すると、常にこのような別の文字/しかし、あなたは10桁(0-9)と20何かの文字に制限されます。

+0

私は従いません。 – user5117999

+0

リストからポップするのはひどい考えです。あなたはバットからパスワードのエントロピーを減らしています。 – l0b0

+0

エントロピーを減らさずに文字を繰り返すことはできますか? – rodjun

関連する問題