python password rules validation -


i'm practicing python , i'm having trouble understanding why code won't take - function takes string , if it's @ least 10 characters in length, has @ least 1 digit, 1 lowercase, , 1 uppercase letter, should return true. also, there's gotta more succinct way write did these nested conditionals. all!

import string alphalower = string.ascii_lowercase alphaupper = string.ascii_uppercase digs = string.digits  def checkio(data):     if len(data) >= 10:         if data.count(digs) >= 1:             if data.count(alphaupper) >= 1:                 if data.count(alphalower) >= 1:                     return true     else:         return false 

the following should work, , removes unnecessary imports :

def checkio(data):     return len(data) >= 10 , any(char.isdigit() char in data) , any(char.islower() char in data) , any(char.isupper() char in data) 

you can iterate on strings default, , each string has isdigit, islower, etc... methods can use. any() method returns true if of values returned iterable passed true, , something(value) value in iterable syntax creates generator expression, iterates on each character of string , checks whether it's digit/lowercase/uppercase character.

based on this answer.


benchmark time, horrible benchmark code (but seems job) :

from time import time import re  data = "ulffunh8ni" # password  def benchmark(method): # benchmark method, loops 1000000 times , prints how took     start = time()     _ in range(1000000): method(data)     print(time() - start)  def checkio_kasra(data): # kasra's answer     return len(data) >= 10 , all([any(i.isdigit() in data),any(i.islower() in data),any(i.isupper() in data)])  def checkio_andreysabitov(data): # andrey sabitov's regex-based answer     if len(data) < 10:         return false      digital = re.compile('[0-9]+')     capital = re.compile('[a-z]+')     lower = re.compile('[a-z]+')      return (digital.search(data) not none) , (capital.search(data) not none)  , (lower.search(data) not none)  def checkio_andredaniel(data): # answer     return len(data) >= 10 , any(char.isdigit() char in data) , any(char.islower() char in data) , any(char.isupper() char in data)  def checkio_shashank_bitmask(data):     if len(data) < 10: return false     lud_bitmask = 0     ch in data:         if ch.islower():             lud_bitmask |= 4             if lud_bitmask == 7: return true         elif ch.isupper():             lud_bitmask |= 2             if lud_bitmask == 7: return true         elif ch.isdigit():             lud_bitmask |= 1             if lud_bitmask == 7: return true     return false  def checkio_shashank_pure_regex(data):     return bool(re.match(r'(?=.*?[0-9])(?=.*?[a-z])(?=.*?[a-z]).{10}', data))  def checkio_shashank_impure_regex(data):     return len(data) >= 10 , re.match(r'(?=.*?[0-9])(?=.*?[a-z])(?=.*?[a-z])', data)  benchmark(checkio_kasra) benchmark(checkio_andreysabitov) benchmark(checkio_andredaniel) benchmark(checkio_shashank_bitmask) benchmark(checkio_shashank_pure_regex) benchmark(checkio_shashank_impure_regex) 

the results, on low-end tablet running windows 7 , python 3.4.x (ran 2 times sure) :

$ python pass.py 6.333611011505127 # shashank 9.625216960906982 # kasra 11.450419902801514 # andrey sabitov 8.36161494255066 # me 

however, given semi-incorrect input of 1xyzxyzxyz (length , digits good, uppercase), solutions fail stop :

7.456813097000122 # shashank 9.328815937042236 # kasra 11.169620037078857 # andrey sabitov 6.349210977554321 # me 

note these benchmarks don't take account eventual edits. suggest run benchmark on own machine using latest answers. feel free update post new results.


Comments

Popular posts from this blog

php - How to modify a menu to show sub-menus -

shopping cart - Page redirect not working PHP -

python - Installing PyDev in eclipse is failed -