Форум сайта python.su
Более опытные товарищи, подскажите.
Хочу написать проверку пароля на подряд повторяющиеся символы. А именно как часто повторяются подряд два, три, четыре символа.
Пока написал так, но я не знаю как реализовать проверку, если совпало три символа, сколько ещё символов совпадает.
password = ['oftiiiomue', 'vvveqbryd5', 'xveeevk6i7', 'llot7ju79c', 'opu5xzppmb', 'tjyt5sghmm', 'ok5yx77wvn', '0yctvllrer', 'bbgea92ekn', 'gwfpqqhske', 'bzibsmmzlo'] def check2(i): if i[0] == i[1]: return 2 if i[1] == i[2]: return 2 if i[2] == i[3]: return 2 if i[3] == i[4]: return 2 if i[4] == i[5]: return 2 if i[5] == i[6]: return 2 if i[6] == i[7]: return 2 if i[7] == i[8]: return 2 if i[8] == i[9]: return 2 def check3(i): if i[0] == i[1] and i[1] == i[2]: return 3 if i[1] == i[2] and i[2] == i[3]: return 3 if i[2] == i[3] and i[3] == i[4]: return 3 if i[3] == i[4] and i[4] == i[5]: return 3 if i[4] == i[5] and i[5] == i[6]: return 3 if i[5] == i[6] and i[6] == i[7]: return 3 if i[6] == i[7] and i[7] == i[8]: return 3 if i[7] == i[8] and i[8] == i[9]: return 3 for i in password: if check2(i) != None: print 'check2', i if check3(i) != None: print 'check3', i
Офлайн
password = ['oftiiiomue', 'vvveqbryd5', 'xveeevk6i7', 'llot7ju79c', 'opu5xzppmb', 'tjyt5sghmm', 'ok5yx77wvn', '0yctvllrer', 'bbgea92ekn', 'gwfpqqhske', 'bzibsmmzlo'] def check_dup(passw): x = tmp = 0 while x < len(passw): if tmp == passw[x]: return True tmp = passw[x] x +=1 return False for x in password: print x, check_dup(x)
oftiiiomue True vvveqbryd5 True xveeevk6i7 True llot7ju79c True opu5xzppmb True tjyt5sghmm True ok5yx77wvn True 0yctvllrer True bbgea92ekn True gwfpqqhske True bzibsmmzlo True
Офлайн
SingularityСпасибо, что ответили.
Офлайн
Вот с заданным числом вхождений подряд , хотя как-то многословно вышло…
Возвращает символ который входит n или более раз
from collections import deque from itertools import takewhile def check_dup_n(passw, n=2): i = 0 acc = deque() while i < len(passw): char = passw[i] dup = list(takewhile(lambda x: x == char, reversed(acc) )) if len(dup) >= n: return dup[0] if len(acc) >= n : acc.popleft() acc.append(char) i += 1 return False
Отредактировано Singularity (Фев. 4, 2014 11:03:41)
Офлайн
Singularity
Вот с заданным числом вхождений подряд , хотя как-то многословно вышло…Возвращает символ который входит n или более раз
oftiiiomue
oftiiomue
oftiiiomme
Офлайн
import re from collections import Counter password = ['oftiiiomue', 'vvveqbryd5', 'xveeevk6i7', 'llot7ju79c', 'opu5xzppmb', 'tjyt5sghmm', 'ok5yx77wvn', '0yctvllrer', 'bbgea92ekn', 'gwfpqqhske', 'bzibsmmzlo'] for w in password: c = Counter(w) letters = [x[0] for x in c.most_common() if x[1] > 1] for l in letters: s = [x for x in re.findall(r'(%s*)' % l, w) if len(x) > 1] if s: print "%s => %s %s раз" % (w, s[0][0], len(s[0]))
Офлайн
FishHookЧто-то похожее.
Офлайн
from itertools import groupby password = ['oftiiiomue', 'vvveqbryd5', 'xveeevk6i7', 'llot7ju79c', 'opu5xzppmb', 'tjyt5sghmm', 'ok5yx77wvn', '0yctvllrer', 'bbgea92ekn', 'gwfpqqhske', 'bzibsmmzlo'] for p in password: print(sorted(((len(s), s[0] ) for s in (tuple(kv[1]) for kv in groupby(p))), key=lambda x: x[0], reverse=True))
Офлайн
Вот без посимвольного перебора, возможно, самый быстрый вариант (+ можно регепс скомпилировать заранее):
import re password = ['oftiiiomue', 'vvveqbryd5', 'xveeevk6i7', 'llot7ju79c', 'opu5xzppmb', 'tjyt5sghmm', 'ok5yx77wvn', '0yctvllrer', 'bbgea92ekn', 'gwfpqqhske', 'bzibsmmzlo'] for pasw in password: for letter, length in re.findall(r'(\w)(\1+)', pasw): print pasw, letter, len(length)+1
Отредактировано o7412369815963 (Фев. 4, 2014 15:08:26)
Офлайн
paraman
А как узнать количество совпадений?
paramanи что должна возвращать функция ?А вот тут уже три раза iii и два раза mmoftiiiomme
Офлайн