perl вытащить текст по критериям

Модератор: Модераторы разделов

Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

perl вытащить текст по критериям

Сообщение gcc »

есть текст допустим

на perl


Код: Выделить всё

sdf sdfsdf sd f gggg 345fget 4tert45 g.g.g.g bla-bla: bbla
sdf sdfsdf sd f gggg 345fgefgt 4tert45 g.g.g.g


1) Как мне вытащить gggg g.g.g.g bla-bla: bbla?

(gggg g.g.g.g - это одно слово, между ними надо убрать мусор)

если bla-bla: bbla нету, то вытащить без нее


2) и как написать чтобы этот текст игнорировался до цифры 345fget 4tert45 5.5.5.5 до 5.5.5.5

3) проблема:

как выбрать дату, убрать ^- *$

^-09-05-2009*$1:7:5

тут так не работает (.+?) знак звездочка мешает
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
27.05.2009 03:23
1) Как мне вытащить gggg g.g.g.g bla-bla: bbla?

(gggg g.g.g.g - это одно слово, между ними надо убрать мусор)

если bla-bla: bbla нету, то вытащить без нее

Код: Выделить всё

#!/bin/sed
s/(gggg).*(g\.g\.g\.g)( bla-bla: bbla)/\1\2\3/
t #  bla-bla: bbla есть, работа завершена
s/(gggg).*(g\.g\.g\.g)/\1\2/ # если нет
gcc писал(а):
27.05.2009 03:23
2) и как написать чтобы этот текст игнорировался до цифры 345fget 4tert45 5.5.5.5 до 5.5.5.5

Код: Выделить всё

s/(.*)5\.5\.5\.5.*/\1/ # выделяет до 5.5.5.5
gcc писал(а):
27.05.2009 03:23
тут так не работает (.+?) знак звездочка мешает
ну... экранируйте звёздочку... в чём проблема?
\* это просто звёздочка...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

drBatty писал(а):
27.05.2009 04:00

Код: Выделить всё

s/(.*)5\.5\.5\.5.*/\1/ # выделяет до 5.5.5.5


тут не поулчается, оно сносит первую цифры! не знаю почему на perl пишу

желательно на perl написать


drBatty писал(а):
27.05.2009 04:00

Код: Выделить всё

s/(.*)5\.5\.5\.5.*/\1/ # выделяет до 5.5.5.5
gcc писал(а):
27.05.2009 03:23
тут так не работает (.+?) знак звездочка мешает
ну... экранируйте звёздочку... в чём проблема?
\* это просто звёздочка...


звездочка стоит в текстовом файле

нужно в текстовом файле экранирвоать что-ли?

(.*) или (.\*) если так написать, то не работает второй вариант вообще! а первый как был так и есть игнорирует строку там где звездочка
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: perl вытащить текст по критериям

Сообщение pcodr »

gcc писал(а):
27.05.2009 03:23
как выбрать дату, убрать ^- *$

^-09-05-2009*$1:7:5


Код: Выделить всё

($t = '^-09-05-2009*$1:7:5') =~ s/[ *\$\^-]//g;
remote system type is unix
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

это надо сделать поиск в тексте, в одном месте попалось *$ как это обработать и все остальное?

1) а звездочку как обойти? оно просто пропускает эту строку если там попадается звездочка!
2) в другом месте везде, оно захватыает и срезает одну цифру тут .*([\d+]): до двоеточия 2 цифры, а оно одну удаляет после звездочки в регулярке...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
27.05.2009 04:32
тут не поулчается, оно сносит первую цифры! не знаю почему на perl пишу

сносит... потому что звёздочка жадная, и есть ещё варианты. попробуйте не жадную .*? (такого в sed нету)
gcc писал(а):
27.05.2009 04:32
желательно на perl написать
не буду. потому что во первых я не Фридл, а во вторых уже напиано Фридл Дж. - Регулярные выражения.
купите эту книжку, не пожалеете!

gcc писал(а):
27.05.2009 04:32
(.*) или (.\*) если так написать, то не работает второй вариант вообще! а первый как был так и есть игнорирует строку там где звездочка

а точка это что? тут надо ман курить... это любой символ, но не вообще любой, а любой допустимый.есть и недопустимые, это и от ос и от локали зависит... может у вас там что-то перед звёздочкой? а может есть ещё звёздочка?
попробуйте захватить не любой символ сколько угодно раз, а только допустимые, например если в дате только [-0-9], их и захватывайте, причём пустой даты не бывает, потому [-0-9]+, а звёздочку можете захватить отдельно, например [-0-9]+\*

gcc писал(а):
27.05.2009 11:15
1) а звездочку как обойти? оно просто пропускает эту строку если там попадается звездочка!
2) в другом месте везде, оно захватыает и срезает одну цифру тут .*([\d+]): до двоеточия 2 цифры, а оно одну удаляет после звездочки в регулярке...
ну и не используйте здесь .*
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: perl вытащить текст по критериям

Сообщение pcodr »

gcc писал(а):
27.05.2009 11:15
это надо сделать поиск в тексте, в одном месте попалось *$ как это обработать и все остальное?

1) а звездочку как обойти? оно просто пропускает эту строку если там попадается звездочка!


Код: Выделить всё

'abc^-09-05-2009*$1:7:5def' =~ /(.+)/;
print "$1\n";


Результат: abc^-09-05-2009*$1:7:5def
Что не так со звездочкой?
remote system type is unix
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
27.05.2009 11:15
1) а звездочку как обойти?

может это не звёздочка вовсе?

Shell

$ echo * du.sed lines1.txt lines2.txt lines3.txt sc.txt st.txt test_drb.txt test.txt ttt ttt2 xdg.sh
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

pcodr писал(а):
27.05.2009 12:42

Код: Выделить всё

'abc^-09-05-2009*$1:7:5def' =~ /(.+)/;
print "$1\n";


Результат: abc^-09-05-2009*$1:7:5def
Что не так со звездочкой?


мне нужно вытащить дату и время, убрать мусор, как это сделать?

регулярное выраждение не работает в этом примере... навреное, мешают знакми доллара или звездочки
если будет просто текст, то регулряка срабатывает... а в этом случае просто пропускает...
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: perl вытащить текст по критериям

Сообщение pcodr »

gcc писал(а):
27.05.2009 22:44
регулярное выраждение не работает в этом примере... навреное, мешают знакми доллара или звездочки
если будет просто текст, то регулряка срабатывает... а в этом случае просто пропускает...


Какое именно не работает? Например такое вполне работает:

Код: Выделить всё

'abc^-09-05-2009*$1:7:5def' =~ /(\d+-\d+-\d+)/;
print  "$1\n";


Результат: 09-05-2009
remote system type is unix
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

Код: Выделить всё

/(\d+-\d+-\d+).*(\d+-\d+-\d+)/

не работает вообще

время как вытащить?
вся проблема вытащить все вместе!

если написать так:

Код: Выделить всё

/(\d+-\d+-\d+).*(\d+):(\d+):(\d+)/
, то проблема такая как я описал выше, остается...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc вы можете дать точный текст того что вводите?

pcodr дал вполне рабочий пример. у меня всё выделяет как надо.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

Код: Выделить всё

^/09-05-2009*$1:7:5def


регулярка которую я написао в предыдущем посту не работает...
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: perl вытащить текст по критериям

Сообщение pcodr »

Видимо у вас возникает проблема из за жадности '.*'.
Ниже показано как можно ограничить её жадность:

Код: Выделить всё

'abc^-09-05-2009*$10:57:05def' =~ /(\d+-\d+-\d+).*?(\d+:\d+:\d+)/;
print  "date:\t$1\ntime:\t$2\n";


Результат:
date: 09-05-2009
time: 10:57:05
remote system type is unix
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

работает

скажите, как определить что бы выбрать какой-то текст если он есть!

допустим если есть :: , то выбрать все что после повторного двоеточия?


123.213.23 :: dfdf
123.213.23
123.213.23 :: dfdf


как мне выбрать айпи и текст если он есть!! если текста нету, то НЕ пропускать айпи...
(как выбрать айпи я знаю, как выбрать текст если он есть!!!?)

тут надо использовать Логические операции в регулярных выражениях ?

но что-то я шаблон не могу подобрать для этого...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
29.05.2009 00:17
тут надо использовать Логические операции в регулярных выражениях
тут надо думать по другому. RE это не бэйсик, тут поиск идёт. Просто поиск в тексте.
В данном случае надо найти XY, и если найдётся - взять только X. выражение для поиска
(X)Y
для замены
\1
Возможны более интересные варианты
найти X, который иногда просто X, а иногда и XY, и взять их оба(если есть)
Выражение для поиска:
X(Y)?

Нпример - рациональное число это либо 12345, либо 12345.6789 Либо есть дробь, либо нет. Регулярное выражение
\d+(.\d+)?
подходит
6
6.7
не подходит
.
.6
7.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
29.05.2009 00:17
но что-то я шаблон не могу подобрать для этого...

странно... простейшая алгебра:
(x+y)(x+y)=xx+2ax+yy
Как видите умножение опускаем, а вот сложение приходится писать... Логика - та-же алгебра, RE та-же логика
XY это X AND Y
X|Y это X OR Y
С отрицанием несколько сложнее, просто на практике отрицание никто не ищет в чистом виде, редко надо найти текст, причём НЕ "вася". такой "поиск застопорится в самом начале любого текста, ну или на второй букве(если текст "вася", то совпадение будет почти сразу, в..."ася"). Иногда NOT всё-же нужно, например все НЕбуквы, для того есть \W, либо [^a-z].

pcodr писал(а):
28.05.2009 07:01
Ниже показано как можно ограничить её жадность:

часто это не срабатывает :(
возможен другой путь, например если надо найти то что в кавычках, то ищем
"[^"]*"
т.е. кавычку, затем сколько-то некавычек, а потом опять кавычку.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

Я пробовал писать так как вы написали, оно не срабатывает, оно пропускает просто...
http://citforum.univ.kiev.ua/internet/perl/regexp/

какой там шаблон выбрать?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
29.05.2009 02:37
Я пробовал писать так как вы написали, оно не срабатывает, оно пропускает просто...
http://citforum.univ.kiev.ua/internet/perl/regexp/
какой там шаблон выбрать?
по вашей ссылке полно вопросов, причём вроде все с ответами... Вы мне лучше не чужие мануалы показывайте, а свой код, в чужих всё верно...
И как-нибудь так, что-бы я его запустить смог, желательно просто скопировать и всё, а то так сложновато будет... У меня почему-то срабатывает...

PS

$

sed -rn '/\?/{s/[^?]//g;H};${g;s/\n//g;p}' perl.txt|wc 1 1 262

по вашей ссылке 262 вопроса :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »



я написал что я не знаю как выбрать текст если он есть...!

если я начну забирать текст, то в тех строках где нету текста, строка будет просто игнорироватся...

тут надо условие написать в регулярке? по той ссылке были условия, но там не написано что-то для этого вопроса...

UPD:

получилоcь:

Код: Выделить всё

(?:.*?::(.*))?


после двоеточия повторного всё записывается в текущую $номер_последовательности или в вывод
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

gcc писал(а):
29.05.2009 10:29
получилоcь:
ну а теперь гуру в перловке, расскажите, как это понять?

gcc забыл сказать, в perl, символ точка не совпадает с переводом строки, т.о. .* пожирает только конец строки, кроме того, точка совпадает с любым символом, не не с чем угодно! точка не совпадает например с концом строки, или символом \x00

ЗЫЖ хотя правила эти довольно сложные, да и помню я их смутно... В смысле - могу ошибиться.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: perl вытащить текст по критериям

Сообщение pcodr »

drBatty писал(а):
29.05.2009 16:09
gcc писал(а):
29.05.2009 10:29
получилоcь:
ну а теперь гуру в перловке, расскажите, как это понять?

Констукция (?: делает пару скобок не захватывающими, а группирующими. Конструкция .*?:: соответствует всему тексту в строке вплоть до пары двоеточий плюс сами эти двоеточия. Конструкция (.*) захватывает все что есть до конца строки. Конструкция )? позволяет не запороться регулярному выражению даже если в строке нет соответсвия описанному ранее.

drBatty писал(а):
29.05.2009 02:33
pcodr писал(а):
28.05.2009 07:01
Ниже показано как можно ограничить её жадность:

часто это не срабатывает :(

Не срабатывает потому что в sed'e нет ограничителей жадности? :)
remote system type is unix
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: perl вытащить текст по критериям

Сообщение drBatty »

pcodr писал(а):
29.05.2009 17:12
Констукция (?: делает пару скобок не захватывающими, а группирующими. Конструкция .*?:: соответствует всему тексту в строке вплоть до пары двоеточий плюс сами эти двоеточия. Конструкция (.*) захватывает все что есть до конца строки. Конструкция )? позволяет не запороться регулярному выражению даже если в строке нет соответсвия описанному ранее.

угу... я и говорю - жуть. вы не могли-бы упростить выражение?
про (?: я знаю, остальное есть в sed.
pcodr писал(а):
29.05.2009 17:12
Не срабатывает потому что в sed'e нет ограничителей жадности?

нет. и это хорошо. не срабатывает конечно не в sed-е, а в php preg_match. Ну и в перле видимо. Что-то нет у меня истории изменения всех файлов, по тому на вскидку не скажу, что я там такое криворучил - факт, что если условие конца *? сложное, то не всегда срабатывает. Ну что-то вроде классического
AAAA
Как обработается A.*?A?
AA___AA
или
A___A
___A___A
или
A______A
___AA___
?
В этом простом случае можно проверить и/или подумать, но это очень простой случай....
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
gcc
Сообщения: 526
ОС: FreeBSD 8.0 CURRENT

Re: perl вытащить текст по критериям

Сообщение gcc »

Код: Выделить всё

A___A
___A___A


в этом случае можно так: s/_//g;

примерно так можно /A(.*?)A/;

а чтобы полностью, то не знаю точно, с хожу не реально
еще можно с помощю splite как-то попробовать

сложная обрабокта текста очень редко где применяется


в perl5.10.0 добавились новые возможности
http://search.cpan.org/~rgarcia/perl-5.10..../pod/perlre.pod

вот как эл. перевод перевидит :laugh:


(*PRUNE) (*PRUNE:NAME)

This zero-width pattern prunes the backtracking tree at the current point when backtracked into on failure. Consider the pattern A (*PRUNE) B, where A and B are complex patterns. Until the (*PRUNE) verb is reached, A may backtrack as necessary to match. Once it is reached, matching continues in B, which may also backtrack as necessary; however, should B not match, then no further backtracking will take place, and the pattern will fail outright at the current starting position.


Это нулевая-ширина шаблона плодов дерева отступает на текущий момент, когда в backtracked на провал. Рассмотрим модель (* чернослив) B, где А и B являются сложными моделями. До (* чернослив) глагол будет достигнуто, май отступать, как это необходимо для соответствия. Как только это достигнуто, продолжается в соответствие B, который также может отступать в случае необходимости, однако, следует B, не совпадают, то никаких дополнительных сил будет происходить, и модель не удастся прямой на нынешней стартовой позиции.
Спасибо сказали: