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

shopping cart - Page redirect not working PHP -

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

python - Installing PyDev in eclipse is failed -