Уведомления

Группа в Telegram: присоединиться

#1 Сен. 11, 2019 20:39:49

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

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

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

Задача такая. Дана строка. Надо определить самую длинную повторяющуюся подстроку.
Пример:
'aaaa' == ‘aa’
'aghtfghkofgh' == ‘fgh’
'abc' == None

Вот это здесь не работает:

((.+)+)((.)*)\1+
(?= (\w+)(.*))\1+
(?= (\w+)+)((.*))\1{2,}
((\w+)+)(.*)\1{2}
(.+)(?:.*\1){2,}
(?:(.*)*)((\w+)+)(?:(.*)*){2,}

Отредактировано oldjaponec@gmail.com (Сен. 12, 2019 01:07:08)

Офлайн

#2 Сен. 12, 2019 02:32:53

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

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

oldjaponec@gmail.com
Задача такая. Дана строка. Надо определить самую длинную повторяющуюся подстроку.
Пример:
Задание именно в регулярных выражениях? Именно через них надо сделать?



Офлайн

#3 Сен. 12, 2019 17:25:21

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

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

py.user.next
Ну, как бы нет. Просто тут уже принципиально, возможно ли вообще это решить с помощью регулярных выражений. Хотелось бы в них разобраться на примере этого задания. Кроме того, лично у меня, другие пути решения слишком большой перебор предполагают. Загвоздка, кстати, не малая, ещё в том, что повторяющиеся подстроки не должны перекрывать друг друга

Офлайн

#4 Сен. 12, 2019 18:04:32

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

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

Ну, это как с задачей по распознаванию всех возможных E-mail-адресов через регекспы - сделать-то можно, только на выходе получается ужос. В то же время правила питона предполагают ясность кода, чтобы избегать закрадывания багов в нём.

Эту задачу не надо делать через регекспы. Лёгкий конечный автомат спасёт отца русской демократии.

wiki. конечный автомат
wiki. конечный автомат. пример



Офлайн

#5 Сен. 12, 2019 22:28:07

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

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

oldjaponec@gmail.com
Надо определить самую длинную повторяющуюся подстроку.
Надо определить самую длинную повторяющуюся миним 2 раза подстроку те подстрока как максимум в половину длины строки

Отредактировано AD0DE412 (Сен. 12, 2019 22:41:36)

Офлайн

#6 Сен. 12, 2019 23:02:15

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

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

py.user.next
Спасибо. Посмотрю. В любом случае, это точно лишним не будет

Офлайн

#7 Сен. 12, 2019 23:03:36

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

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

AD0DE412
Да, именно так. Кстати, в этом ключе я не думал. Спасибо за идею

Офлайн

#8 Сен. 13, 2019 03:37:18

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

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

Короче, программа такая решала эту задачу быстро и качественно, пока ей не попалась строка ‘arefhjaref!!’, результат которой почему-то ‘!’, а не ‘aref’

l='arefhjaref!!'
k,i=len(l)//2,0
if l!='':
while k>0:
if i==k:k-=1;i==0
if l.count(l[i:k+i])>1:print(l[i:k+i])
i+=1

Отредактировано oldjaponec@gmail.com (Сен. 13, 2019 03:39:39)

Офлайн

#9 Сен. 13, 2019 08:11:00

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

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

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

Отредактировано AD0DE412 (Сен. 13, 2019 08:37:38)

Офлайн

#10 Сен. 13, 2019 08:42:18

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

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

 import re
s = 'arefhjaref!!'
out = []
for i in range(len(s)//2):
    tmp = re.findall(r'(.+).*?\1', s[i:])[0]
    if s.count(tmp) > 1 and len(tmp) > 1:
        out.append(tmp)
out.sort(key=lambda x: len(x))
print(out)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version