Найти - Пользователи
Полная версия: Проверка символов в слове
Начало » Python для новичков » Проверка символов в слове
1
paraman
Более опытные товарищи, подскажите.
Хочу написать проверку пароля на подряд повторяющиеся символы. А именно как часто повторяются подряд два, три, четыре символа.
Пока написал так, но я не знаю как реализовать проверку, если совпало три символа, сколько ещё символов совпадает.

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

Вот как-то так смог реализовать.
Спасибо, что тратите своё время на мой вопрос.
Singularity
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
paraman
Singularity
Спасибо, что ответили.

А как узнать количество совпадений?
2-а раза, 3-и раза, 3-и раза и два раза итд?
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
paraman
Singularity
Вот с заданным числом вхождений подряд , хотя как-то многословно вышло…Возвращает символ который входит n или более раз

Вероятно я не правильно объясняю.
Мне нужно проверить количество вхождений символов.
Пример:
Есть такой пароль
oftiiiomue
Как видно в него три раза входит символ iii
oftiiomue
Тут уже два раза ii
oftiiiomme
А вот тут уже три раза iii и два раза mm
Вот такая проверка мне нужна. На количество одинаковых символов.
FishHook
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]))
paraman
FishHook
Что-то похожее.
Shaman
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))
o7412369815963
Вот без посимвольного перебора, возможно, самый быстрый вариант (+ можно регепс скомпилировать заранее):
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
py.user.next
paraman
А как узнать количество совпадений?
paraman
oftiiiomme
А вот тут уже три раза iii и два раза mm
и что должна возвращать функция ?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB