Home > Software design >  No duplicate characters in string output - Python
No duplicate characters in string output - Python

Time:08-25

What im making

Hi! Im making a password generator script in Python ( Script below ). and i was wondering what the best way would be to make sure the passwords dont have two of the same character/symbol right after eachother.

as an example:

kjhd8!3JJp-#huwwg

i would like a way within my script to make sure the duplicates arent "touching". if that makes sense (my english isnt very good).

the same password can have the same character, thats fine. but i would like it not to have them "touching"

like:

kjwhd8!3Jp-#huwJg

if that makes sense.



The script

import random
import string
import sys

#amount of passwords to make
amount = 10

# Characters and symbols to use for the password
# ive split it up to make sure it takes from all of the lists
chars ="abcdefghjkmnpqrstuvwxyzABCDEFGHJK"
specials="#####!-----"
digits="2346789"
characters = list(chars   digits   specials)

def generate_random_password():
    # length of the passwords
    length = 18

    # mixes and shuffles the characters
    random.shuffle(characters)

    # Puts the sections together at random
    password = []
    for i in range(length):
        password.append(random.choice(characters) )

    # another shuffle to make sure (probably noy needed but meh)
    random.shuffle(password)

    # converts to a string
    print("".join(password))

# Prints out as many passswords as stated in the "amount" variable
for index in range(amount):
    generate_random_password()

CodePudding user response:

You can just check if the generated char is the same that the previous one, if it is: pick another char, else continue.

prev_char=None
for i in range(length):
        random_char = random.choice(characters)
        while prev_char == random_char:
                random_char = random.choice(characters)
        password.append(random_char)
        prev_char = random_char

CodePudding user response:

You can use a regex for this!

The expression:

(.)\1

What it does:

(.)   - group that matches one character
\1    - reference to group 1 (the group above)

What this essentially does is that it looks for a character repeating right after itself.

How to use it?

import re

any(re.findall(r"(.)\1", "kjwhd8!3Jp-#huwJg"))

findall will find any ocurrences of this; any will give you True or False if there are any cases.

Note: You could also extend this so that the same character doesn't repeat within the next let's say 4 characters: (.).{0,4}\1

  • Related