LINUX.ORG.RU

python re жадность «влево»?

 ,


0

1

Есть строка:
'rattatt 123one tratatttat kukareku1 122left tratata ta ta ta ta 211two tratatata tatat tata kukareku2 trattat tatta tt 56three tatatta kukareku3'
где tratatat и т.п произвольный набор символов описываемый '.*'.

sting = 'trattatt 123one tratatttat kukareku1 122left tratata ta ta ta ta 211two tratatata tatat tata kukareku2 trattat tatta tt 56three tatatta kukareku3'
myre = '\d+(\w+).+?kukareku(\d)'
re.findall(myre, string)
Cоответственно жадность «вправо» я запрещаю знаком '?' Дает результат:
[('one', '1'), ('left', '2'), ('three', '3')]
, а хочеться:
[('one', '1'), ('two', '2'), ('three', '3')]
,т. е. мне нужно 'попросить' выражение соответствовать наиболее короткой возможной подстроке.



Последнее исправление: CYB3R (всего исправлений: 1)

Значит, надо вместо .+? поставить более точный класс символов, например так:

In [8]: myre = '\d+(\w+)\D+?kukareku(\d)'

In [9]: re.findall(myre, sting)
Out[9]: [('one', '1'), ('two', '2'), ('three', '3')]
provaton ★★★★★
()
Последнее исправление: provaton (всего исправлений: 1)

<bdsm>

нужно обратить строчку и делать обратный re, как то так

re.findall('(\d)ukerakuk.+?(\w+)\d+',''.join(reversed(sting)))

</bdsm>

mashina ★★★★★
()
Ответ на: комментарий от mashina

Тоже не то, в реальном тексте при переворачивании возникнет та же проблема, но в с другой частью выражения.

kirik-88
() автор топика
Ответ на: комментарий от kirik-88

Значит, сделай в несколько операций. Не факт, что твоя грамматика - регулярная.

provaton ★★★★★
()

сделай split строки по своему кукареку, на вид это не регулярная грамматика.

dimon555 ★★★★★
()

Вот так подойдет?

myre = '\d+(\w+)\D+kukareku(\d)'

Umpi
()
Ответ на: комментарий от Uter

\d+(\w+)(?:(?:.(?!\d+\w+))+?)kukareku(\d)

Вот оно! То, что нужно! Весь вечер промучался с этим «взглюдом вперед», но так и не дошел до этого. Спасибо!

kirik-88
() автор топика
Ответ на: комментарий от kirik-88

Книжка Фридла и хороший отладчик решают

В качестве отладчика - RegexBuddy

Uter
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.