Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2014 10:07:14

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка символов в слове

Более опытные товарищи, подскажите.
Хочу написать проверку пароля на подряд повторяющиеся символы. А именно как часто повторяются подряд два, три, четыре символа.
Пока написал так, но я не знаю как реализовать проверку, если совпало три символа, сколько ещё символов совпадает.

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

Вот как-то так смог реализовать.
Спасибо, что тратите своё время на мой вопрос.

Офлайн

#2 Фев. 4, 2014 10:21:39

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Проверка символов в слове

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

Офлайн

#3 Фев. 4, 2014 10:37:44

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка символов в слове

Singularity
Спасибо, что ответили.

А как узнать количество совпадений?
2-а раза, 3-и раза, 3-и раза и два раза итд?

Офлайн

#4 Фев. 4, 2014 10:56:12

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Проверка символов в слове

Вот с заданным числом вхождений подряд , хотя как-то многословно вышло…
Возвращает символ который входит 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)

Офлайн

#5 Фев. 4, 2014 11:48:49

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка символов в слове

Singularity
Вот с заданным числом вхождений подряд , хотя как-то многословно вышло…Возвращает символ который входит n или более раз

Вероятно я не правильно объясняю.
Мне нужно проверить количество вхождений символов.
Пример:
Есть такой пароль
oftiiiomue
Как видно в него три раза входит символ iii
oftiiomue
Тут уже два раза ii
oftiiiomme
А вот тут уже три раза iii и два раза mm
Вот такая проверка мне нужна. На количество одинаковых символов.

Офлайн

#6 Фев. 4, 2014 12:05:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проверка символов в слове

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]))



Офлайн

#7 Фев. 4, 2014 12:17:14

paraman
Зарегистрирован: 2012-07-10
Сообщения: 170
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка символов в слове

FishHook
Что-то похожее.

Офлайн

#8 Фев. 4, 2014 12:40:05

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Проверка символов в слове

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))

Офлайн

#9 Фев. 4, 2014 15:04:00

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Проверка символов в слове

Вот без посимвольного перебора, возможно, самый быстрый вариант (+ можно регепс скомпилировать заранее):

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)

Офлайн

#10 Фев. 4, 2014 21:04:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9732
Репутация: +  843  -
Профиль   Отправить e-mail  

Проверка символов в слове

paraman
А как узнать количество совпадений?
paraman
oftiiiomme
А вот тут уже три раза iii и два раза mm
и что должна возвращать функция ?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version