Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 14, 2019 20:12:01

oldjaponec@gmail.com
Зарегистрирован: 2019-09-03
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

vic57
Весьма неплохо. Я только вот недавно додумался использовать индексы(функцию find)

И всё же, мне кажется, должен быть способ, просто в одном регулярном выражении это отыскать… или мне кажется

Офлайн

#2 Сен. 14, 2019 20:41:13

oldjaponec@gmail.com
Зарегистрирован: 2019-09-03
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

AD0DE412
Какое издание Лутца?

Офлайн

#3 Сен. 14, 2019 20:43:28

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

четвертое. тока там кусочками все (хотя система какая ни какая прослеживается) и мммммееееедддддееееенннннооооо явно с расчетом на следующую книгу(и).
в общем базовые вещи, обзорная такая штука, хорошо хоть отношение нормальное к читателю. без детского сада (ну почти).




1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Сен. 14, 2019 21:11:49)

Офлайн

#4 Сен. 14, 2019 21:19:59

oldjaponec@gmail.com
Зарегистрирован: 2019-09-03
Сообщения: 13
Репутация: +  1  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

AD0DE412
Тоже четвертое начал читать на телефоне. На компе пятое на английском через переводчик смотрю потом по главе для сравнения. С английским всё ещё хуже, чем с регулярными выражениями

Офлайн

#5 Сен. 15, 2019 00:18:46

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

Нужна помощь по регулярным выражением re

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

Так что тебе просто надо разделить изучение регулярных выражений и решение каких-либо задач на строки. Когда будешь знать регулярные выражения, тогда и увидишь, где они вообще не подходят.



Офлайн

#6 Сен. 15, 2019 06:38:23

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

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)

Отредактировано vic57 (Сен. 15, 2019 06:44:24)

Офлайн

#7 Сен. 15, 2019 10:53:01

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

Нужна помощь по регулярным выражением re

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 раз. Учитывая, что вам надо еще доделать свою программу и каким-то образом получить нужную последовательность из списка, боюсь выичслительная сложность еще значительно возрастёт. Да и с памятью тоже все плохо. То есть, вынужден признать, что проще решить не только можно, но и нужно - ваш алгоритм нельзя назвать хорошим.



Офлайн

#8 Сен. 15, 2019 12:35:07

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

кхм кхм

 import timeit
def test():
    from itertools import takewhile
print(timeit.timeit("test", setup="from __main__ import test", number=1))

 3.9211334579292156e-07



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Офлайн

#9 Сен. 15, 2019 13:05:45

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

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

Отредактировано vic57 (Сен. 15, 2019 13:06:36)

Офлайн

#10 Сен. 15, 2019 13:14:32

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Нужна помощь по регулярным выражением re

эээ … у вас … вы исходите из предположения что самый длинный элемент один (что не всегда так) так что формально FishHook прав но если используются только эти данные (строки) то …
зы без обид я истины ради мне все это было поучительно спсб



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Сен. 15, 2019 13:23:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version