Найти - Пользователи
Полная версия: Нужна помощь по регулярным выражением re
Начало » Python для новичков » Нужна помощь по регулярным выражением re
1 2 3 4
oldjaponec@gmail.com
vic57
Весьма неплохо. Я только вот недавно додумался использовать индексы(функцию find)

И всё же, мне кажется, должен быть способ, просто в одном регулярном выражении это отыскать… или мне кажется
oldjaponec@gmail.com
AD0DE412
Какое издание Лутца?
AD0DE412
четвертое. тока там кусочками все (хотя система какая ни какая прослеживается) и мммммееееедддддееееенннннооооо явно с расчетом на следующую книгу(и).
в общем базовые вещи, обзорная такая штука, хорошо хоть отношение нормальное к читателю. без детского сада (ну почти).


oldjaponec@gmail.com
AD0DE412
Тоже четвертое начал читать на телефоне. На компе пятое на английском через переводчик смотрю потом по главе для сравнения. С английским всё ещё хуже, чем с регулярными выражениями
py.user.next
oldjaponec@gmail.com
И всё же, мне кажется, должен быть способ, просто в одном регулярном выражении это отыскать… или мне кажется
Тебе кажется. В регулярных выражениях ничего сложного нет. Их вполне реально выучить, имея только школьную базу навыков. Просто существуют задачи, которые непригодны для решения регулярными выражениями. Нельзя считать так: если в строке надо что-то найти, то для этого подойдут регулярные выражения. Это далеко не всегда так. Теоретически они подходят ко многому, а на практике очень часто получается неподходящий результат и нарушается принцип ясности кода.

Так что тебе просто надо разделить изучение регулярных выражений и решение каких-либо задач на строки. Когда будешь знать регулярные выражения, тогда и увидишь, где они вообще не подходят.
vic57
oldjaponec@gmail.com
И всё же, мне кажется, должен быть способ, просто в одном регулярном выражении это отыскать… или мне кажется
мой метод повторяет ф-цию strstr() из Си, проще вряд ли прлучится. в регах под капотом те же циклы
чуть оптимизировал
 s = 'arefhjaref!!'
out = []
for i in range(len(s)):
    t = s[i:]
    for j in range(2,len(t)):
        s1,s2 = t[:j],t[j:]
        if s2.find(s1) < 0: 
            continue
        out.append(s1)
out.sort(key = lambda x: len(x),reverse=True)
print(out)
FishHook
vic57
ваш код не решает поставленную задачу
>>> Надо определить самую длинную повторяющуюся подстроку.

 s = 'arefhjjjjaref!!'
out = []
for i in range(len(s)):
    t = s[i:]
    for j in range(2,len(t)):
        s1,s2 = t[:j],t[j:]
        if s2.find(s1) < 0:
            continue
        out.append(s1)
out.sort(key = lambda x: len(x),reverse=True)
print(out)

>>>['aref', 'are', 'ref', 'ar', 're', 'ef', 'jj']
вы, вероятно чего-то не додумали, в выводу вашей программы я не вижу самой длинной подстроки


vic57
проще вряд ли прлучится
ну и здесь вы не правы. Задача решается в один проход. Посмотрите на мой пример выше, там как раз реализовано решение в один проход. У вас вложенные циклы, что сразу значительно увеличит вычислительную сложность. Я сделал небольшой тест:

   
from itertools import takewhile
import random
import timeit
def find_longest_substr1(string):
    longest_seq = ""
    s = string
    while s:
        char = s[0]
        seq = list(takewhile(lambda i: i == char, s))
        length = len(seq)
        if length > len(longest_seq):
            longest_seq = seq
        s = s[length:]
    return "".join(longest_seq)
def find_longest_substr2(string):
    out = []
    for i in range(len(string)):
        t = string[i:]
        for j in range(2, len(t)):
            s1,s2 = t[:j], t[j:]
            if s2.find(s1) < 0:
                continue
            out.append(s1)
    out.sort(key=lambda x: len(x), reverse=True)
    return out
_s = ["a", "b", "c", "d", "e"]
s = "".join(random.choice(_s) for _ in range(1000))
print(timeit.timeit("find_longest_substr1(s)", setup="from __main__ import find_longest_substr1, s", number=1))
print(timeit.timeit("find_longest_substr2(s)", setup="from __main__ import find_longest_substr2, s", number=1))
и вот результат
>>>0.0018036999999999984
>>>0.5519485999999999
на строке из тысячи символов ваш код медленнее в 550 раз. Учитывая, что вам надо еще доделать свою программу и каким-то образом получить нужную последовательность из списка, боюсь выичслительная сложность еще значительно возрастёт. Да и с памятью тоже все плохо. То есть, вынужден признать, что проще решить не только можно, но и нужно - ваш алгоритм нельзя назвать хорошим.
AD0DE412
кхм кхм
 import timeit
def test():
    from itertools import takewhile
print(timeit.timeit("test", setup="from __main__ import test", number=1))

 3.9211334579292156e-07

vic57
FishHook
вы, вероятно чего-то не додумали, в выводу вашей программы я не вижу самой длинной подстроки
первый элемент в out
FishHook
на строке из тысячи символов ваш код медленнее в 550 раз
питоновские циклы медленные. если б мне надо было - сделал бы Си - модуль
AD0DE412
эээ … у вас … вы исходите из предположения что самый длинный элемент один (что не всегда так) так что формально FishHook прав но если используются только эти данные (строки) то …
зы без обид я истины ради мне все это было поучительно спсб

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