thesoundandthefury
thesoundandthefury

Reputation: 33

Python - Finding all non alpha-numeric characters in a string

I'm designing a system that allows users to input a string, and the strength of the string to be determined by the amount of non alphanumeric characters. Points should be awarded like so: +1 for every non-alnum character to a maximum of 3 non-alnum characters.

def non_alnum_2(total,pwd):
count = 0
lid = 3
number = 0
if pwd[count].isalnum():
    if True:
        print "Nope"
    if False:
        print "Good job"
        count = count + 1
        number += 1
if number > lid:
    number = lid
return number

total = 0
number = 0
pwd = raw_input("What is your password? ")

non_alnum_2(total, pwd)
print total
total += number

I've only just started coding, so I'm sorry if this seems like a very junior question.

Upvotes: 3

Views: 25228

Answers (4)

Tim Lahkey
Tim Lahkey

Reputation: 1

def non_alnum(s):
    temp=[]
    for i in s:
        if i.isalnum():
            continue
        else:
            temp.append(i)
    if temp==[]:
        print("The string doesn't contain any non_alphanumeric chars")
    else:
        print("The string contains non_alphanumeric chars: ",temp)
str1="ABCDEFabcdef123450"
str2="ABCDEF;abcdef'1234!50"
str3="*&%@!}{"
non_alnum(str1)
non_alnum(str2)
non_alnum(str3)

Upvotes: 0

abarnert
abarnert

Reputation: 365845

There are multiple problems with this code.

First, if True: is always true, so the "Nope" will always happen, and if False: is never true, so none of that stuff will ever happen. I think you wanted this:

if pwd[count].isalnum():
    print "Nope"
else:
    print "Good job"
    count = count + 1
    number += 1

Also, I think you want to increment count always, not just if it's a symbol, so:

if pwd[count].isalnum():
    print "Nope"
else:
    print "Good job"
    number += 1
count = count + 1

Meanwhile, you need some kind of loop if you want this to happen over and over. For example:

while count < len(pwd):
    if pwd[count].isalnum():
        # etc.

However, you really don't need to maintain count yourself and keep doing pwd[count]; you can use a for loop for this:

for ch in pwd:
    if ch.isalnum():
         # etc.

Meanwhile, while you do return a value from the end of the function, you don't do anything with that returned value when you call the function. What you need is:

number = non_alnum_2(total, pwd)

Also, there's no reason to pass total to non_alnum_2 here. In fact, it doesn't do anything useful at all.

So, putting it all together:

def non_alnum_2(pwd):
    lid = 3
    number = 0
    for ch in pwd:
        if ch.isalnum():
            print "Nope"
        else:
            print "Good job"
            number += 1
    if number > lid:
        number = lid
    return number

pwd = raw_input("What is your password? ")

number = non_alnum_2(pwd)
print number

Upvotes: 0

MxLDevs
MxLDevs

Reputation: 19546

If you want to count the number of non-alpha strings you could say

def strength(string):
  '''Computes and returns the strength of the string'''

  count = 0

  # check each character in the string
  for char in string:
     # increment by 1 if it's non-alphanumeric
     if not char.isalpha():
       count += 1           

  # Take whichever is smaller
  return min(3, count)

print (strength("test123"))

Upvotes: 1

arshajii
arshajii

Reputation: 129517

You can simply try:

bonus = min(sum(not c.isalnum() for c in pwd), 3)

Upvotes: 11

Related Questions