Article View: pl.comp.lang.perl
Article #39785Re: pierwsze podejscie nietrafione: regex w wielu liniach, mam problem
From: Grzegorz Szyszlo
Date: Wed, 20 Oct 2004 11:13
Date: Wed, 20 Oct 2004 11:13
127 lines
6458 bytes
6458 bytes
Maciej Misiak wrote:
>>A wiec jedyne co jest do zrobienia to w sekcji $smieci zabronic kropce
>
> lykania
>
>>interesujacych nas ciagow jakims, na moje oko, interesujacym assertem.
>
> Jeszcze
>
>>nad tym posiedze.
>
>
> Albo moze troche inne podejscie:
> 1. wyciac smieci
> 2. zastosowac prostego regexpa do wyciagniecia danych
>
> my$cutline='';
> my$regexp = '(Job Type\s*:|'.
> 'Backup mode\s*:|'.
> 'Job Start Time\s*:|'.
> ':\s*Media\s*:|'.
> 'Backup Last Objects\s*:|'.
> 'Job End Time\s*:|'.
> 'Completed Size\s*:|'.
> 'Failed Objects\s*:|'.
> 'Job Completed Succ?essfully|Job)';
> $cutline.="$1$2\n" while $line =~ /^\s*$regexp(.*)$/mg;
> $cutline=~s/^$dwukropek//mg;
>
> print"Po wycieciu smieci:\n$cutline\n\n";
>
> $cutline=~/Job\s*(.+)\n
> Job\ Type $dwukropek (.+)\n
> Backup\ mode $dwukropek (.+)\n
> Job\ Start\ Time $dwukropek (.+)\n
> ((?:Media $dwukropek .+\n)*)
> (?:Backup\ Last\ Objects? $dwukropek (.+)\n)?
> (?:Job\ End\ Time $dwukropek (.+)\n)?
> Completed\ Size $dwukropek (.+)\n
> (?:Failed\ Objects $dwukropek (.+)\n)?
> (?:(Job\ Completed\ Succ?essfully).*\n)?
> (?:Media $dwukropek Home\\.+? - .+? \\ ([^\n\\]+))?
> /x;
> Acha, Media sie pojawia dwa razy(!), wiec wrzucilem w calosci do $5
z media jest gorzej niz myslalem. pierwsze wystapienie po job start time
trzeba pominac, bo tam media jest, albo i nie ma. drugie wystapienie media
trzeba lyknac, ono powinno wystapic prawie zawsze po opcjonalnym
"Job Completed Succ?esfully".
W koncu zdecydowalem sie na uzycie funkcji pos, bo wycinanie smieci
jest dla mnie troche nieintuicyjne, i moze zawiesc. w koncu istotny kawalek
tego kodu wyglada tak:
----------------------------------
pos($line)=0; $pozycja=0;
if ($line=~/ ^Job \s ([^\n]+) \n /xgm)
{$tab[1]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\s Job\ Type \s+ : \s ([^\n]+) \n /xgm)
{$tab[2]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\s Backup\ mode \s+ : \s ([^\n]+) \n /xgm)
{$tab[3]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\s Job\ Start\ Time \s+ : \s ([^\n]+) \n /xgm)
{$tab[4]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s+ Backup\ Last\ Objects? \s+ : \s+ End \s+ ([^\n]+) \n /xgm)
{$tab[5]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s+ Job\ End\ Time \s+ : \s ([^\n]+) \n /xgm)
{$tab[6]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\s Completed\ Size \s+ : \s ([\d]+) [^\n]* \n /xgm)
{$tab[7]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\s Failed\ Objects \s+ : \s ([^\n]+) \n /xgm)
{$tab[8]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\s (Job\ Completed\ Succ?essfully) [^\n]* \n /xgm)
{$tab[9]=$1 ne ''; $pozycja=pos($line);} else {pos($line)=$pozycja;}
if ($line=~/ ^\s\sMedia \s+ : \s Home\\[^\n]+? - [^\n]+? \\ ([^\n\\]+) \n /xgm)
{$tab[10]=$1; $pozycja=pos($line);} else {pos($line)=$pozycja;}
-------------------------------
opcje /x sobie zostawilem, zebym nie musial zlepiac tych wyrazen.
/m jest mi potrzebne, bo uzywam ^
/g potrzebne, zeby mi to dzialalo podobnie do wielokrotnego wyszukiwania tego
samego wyrazenia, tyle ze tutaj symuluje za kazdym razem wyszukiwanie
czegos innego.
btw. dzieki za pomoc, twoje rozwiazanie tez jest skuteczne :)
myslalem tez nad innym wariantem, zeby .... podobnie jak ty niszczyc pierwotny
wyglad przeszukiwanego tekstu, poprzez wyszukiwanie s/ / / .
czyli zamiast m/ ... /g i manipulacji funkcja pos, po prostu stopniowo
odcinalbym to, co bym wlasnie znalazl. ale uznalem ze stopien komplikacji
programu bylby zblizony, a ja nigdy nie wiem czy kolejna nowa wersja
programu do backupu lub kolejny fix, nie zrobi mi jakiejs rewolucji.
glownym mankamentem twojego rozwiazania jest to, ze pomiedzy rexexpem
odsmiecajacym i wyszukujacym, musi byc zachowana pelna synchronizacja.
z kolei obydwa rozwiazania, zakladaja z gory zadana kolejnosc wyszukiwanych
informacji, co w tym przypadku nie jest istotnym problemem, ale ...
... w moim rozwiazaniu manipulujac przy pos(), moge w przyszlosci
sobie pozwolic na obsluge nietypowych kolejnosci.
I na koniec slowko do Szymona. mozesz smialo powiedziec
ze zniku znowu nakombinowal jak kon pod gore :)))))
na tym przykladzie bede musial ponownie zrewidowac swoja nikla
nazwijmy to wiedze, na temat zachlannosci wyrazen. nie potrafilem
tu znalezc operatora, o zachlannosci posredniej pomiedzy
dla przykladu * i *? . Chodzi tu w szczegolnosci
o zachlanna wersje operatora ?, bo normalnie jest on chyba
niezachlanny, czego wczesniej nigdy nie bralem pod uwage.
wylazlo to na przykladzie ( .... )? [ tutaj pojawil
sie wariant (?: ... (...) ...)? ] ktore jak nie musi,
to nie dopasuje kompletnie niczego.
poniewaz juz mi dziala, to dziekuje wszystkim za uwage :)
znik.
Technical Details
Message-ID:
<cl5h9t$l3j$1@news.lublin.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!lublin.pl!news.lublin.pl!not-for-mailReferences:
<30b7.00000127.4174ef5d@newsgate.onet.pl> <30b7.00000169.4174fa63@newsgate.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!lublin.pl!news.lublin.pl!not-for-mail From: Grzegorz Szyszlo <znik@wbc.lublin.pl> Newsgroups: pl.comp.lang.perl Subject: Re: pierwsze podejscie nietrafione: regex w wielu liniach, mam problem Date: Wed, 20 Oct 2004 13:13:18 +0200 Organization: lubman Lines: 128 Message-ID: <cl5h9t$l3j$1@news.lublin.pl> References: <30b7.00000127.4174ef5d@newsgate.onet.pl> <30b7.00000169.4174fa63@newsgate.onet.pl> NNTP-Posting-Host: user.wbc.lublin.pl Mime-Version: 1.0 X-Trace: news.lublin.pl 1098270846 21619 212.182.104.10 (20 Oct 2004 11:14:06 GMT) X-Complaints-To: abuse@news.lublin.pl NNTP-Posting-Date: Wed, 20 Oct 2004 11:14:06 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030721 Debian/1.4-1.nobse.2 X-Accept-Language: pl, en-us In-Reply-To: <30b7.00000169.4174fa63@newsgate.onet.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit