regexp albo cos
Marcin Gryszkalis - 03-01-2006 10:30
Witam jakos nie moge znalezc prostego rozwiazania na taka zamiane:
przed: abc def [ghi jkl] [[mno] [pqr]]
po: abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
da sie to jednym s///? a jesli nie to? :) pozdrawiam -- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@chrome.pl, gg:2532994 http://the.fork.pl
=?ISO-8859-2?Q?=A3ukasz_M=B1drzycki?= - 03-01-2006 10:30
Marcin Gryszkalis napisał(a): > Witam > jakos nie moge znalezc prostego rozwiazania na taka zamiane: > przed: > abc def [ghi jkl] [[mno] [pqr]] > po: > abc!def![ghi jkl]![[mno pqr] [stu vwx yz]] > da sie to jednym s///? a jesli nie to? :)
ha, dać mi sie udało, ale czy to jest proste?
#+v while (<DATA>) { s/(\w*)\s(\w*)\s\[(\w*\s\w*)\]\s\[\[(\w*)\]\s\[(\w*)\]\]/$1!$2![$3]![[$4 $5] [stu vwx yz]]/; }
__DATA__ abc def [ghi jkl] [[mno] [pqr]] #-v
pzdr, luk
-- *- uksza(@)at(@)wp(.)dot(.)pl *- RLU: #272802 | got slack?
Szymon =?iso-8859-2?Q?Sok=F3=B3?= - 03-01-2006 10:30
On Mon, 02 Jan 2006 16:51:49 +0100, Marcin Gryszkalis wrote:
> Witam > jakos nie moge znalezc prostego rozwiazania na taka zamiane: > > przed: > abc def [ghi jkl] [[mno] [pqr]] > > po: > abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
No banalne przecież: my $text = 'abc def [ghi jkl] [[mno] [pqr]]'; $text =~ s{\Qabc def [ghi jkl] [[mno] [pqr]]\E} {abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]}; :->
A poważnie: zamiast dawać przykład, lepiej było opisać, co chcesz osiągnąć. Wnioskuję (pytanie, czy trafnie), że chcesz zamienić na wykrzykniki wszystkie te spacje, które nie znajdują się wewnątrz kwadratowych nawiasów. Być może dałoby się wykombinować jakiś skomplikowany regexp, który to załatwi za jednym zamachem, ale IMHO prościej zrobić tak:
my $text = 'abc def [ghi jkl] [[mno] [pqr]]'; my $level=0; sub parser($) { my ($x) = @_; return '!' if $x eq ' ' && !$level; $level++ if $x eq '['; $level-- if $x eq ']'; return $x; } $text =~ s/(.)/&parser($1)/eg;
-- Szymon Sokół (SS316-RIPE) -- Network Manager B Computer Center, AGH - University of Science and Technology, Cracow, Poland O http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F Free speech includes the right not to listen, if not interested -- Heinlein H
Marcin Gryszkalis - 03-01-2006 10:30
Łukasz Mądrzycki wrote: > ha, dać mi sie udało, ale czy to jest proste? > > #+v > while (<DATA>) { > s/(\w*)\s(\w*)\s\[(\w*\s\w*)\]\s\[\[(\w*)\]\s\[(\w*)\]\]/$1!$2![$3]![[$4 > $5] [stu vwx yz]]/; > }
ano faktycznie nie opisalem precyzyjnie - nawiasy kwadratowe oczywiscie moga byc zagniezdzone dowolna ilosc razy...
-- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@chrome.pl, gg:2532994 http://the.fork.pl
Marcin Gryszkalis - 03-01-2006 10:30
Szymon Sokół wrote: > On Mon, 02 Jan 2006 16:51:49 +0100, Marcin Gryszkalis wrote: >>abc def [ghi jkl] [[mno] [pqr]] >>abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
> A poważnie: zamiast dawać przykład, lepiej było opisać, co chcesz osiągnąć. > Wnioskuję (pytanie, czy trafnie), że chcesz zamienić na wykrzykniki > wszystkie te spacje, które nie znajdują się wewnątrz kwadratowych nawiasów. > Być może dałoby się wykombinować jakiś skomplikowany regexp, który to > załatwi za jednym zamachem, ale IMHO prościej zrobić tak:
dobrze wnioskujesz :)
> my $text = 'abc def [ghi jkl] [[mno] [pqr]]'; > my $level=0; > sub parser($) { > my ($x) = @_; > return '!' if $x eq ' ' && !$level; > $level++ if $x eq '['; > $level-- if $x eq ']'; > return $x; > } > $text =~ s/(.)/&parser($1)/eg;
Czyli tak jak sie obawiałem, znaczej po znaczku jak w starym dobrym C ;) Ale z drugiej strony czytelne to jest...
Myslalem naj jakims rekurencyjnym s///eg ale jakos zmeczony za bardzo jesteman na takie cuda :)
-- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@chrome.pl, gg:2532994 http://the.fork.pl
=?ISO-8859-2?Q?Micha=B3_Szafra=F1ski?= - 04-01-2006 09:34
Marcin Gryszkalis wrote:
> Szymon Sokół wrote: > > >>my $text = 'abc def [ghi jkl] [[mno] [pqr]]'; >>my $level=0; >>sub parser($) { >> my ($x) = @_; >> return '!' if $x eq ' ' && !$level; >> $level++ if $x eq '['; >> $level-- if $x eq ']'; >> return $x; >>} >>$text =~ s/(.)/&parser($1)/eg; > > > Czyli tak jak sie obawiałem, znaczej po znaczku jak w starym dobrym C ;) > Ale z drugiej strony czytelne to jest... > > Myslalem naj jakims rekurencyjnym s///eg ale jakos zmeczony za bardzo > jesteman na takie cuda :) >
Można i tak:
$_ = "abc def [ghi jkl] [[mno] [pqr]]"; $x = qr/\[(??{$x})\](??{$x})|[a-z ]+(??{$x})|/; s/(\[$x\])| /$1||"!"/ge;
Według mnie jest to również czytelne, ze względu że wyrażenie $x zawiera wprost opis gramatyki. Mimo to wolę rozwiązanie Szymona bo (??{}) czasami potrafi wywalić interpreter oraz nie wiem dokładnie jaką złożność obliczeniową ma taki kod. Przy jawnym parserze jest oczywiście liniowa. Można go jeszcze trochę przyspieszyć ignorując nieistotne znaki:
$text =~ s{([\[\]])| } { if($1) { $level += $1 eq '['?1:-1; $1 } else { $level?" ":"!" } }eg;
-- m.
Maciej Misiak - 04-01-2006 09:34
Marcin Gryszkalis napisał(a): > Szymon Sokół wrote: > >>my $text = 'abc def [ghi jkl] [[mno] [pqr]]'; >>my $level=0; >>sub parser($) { >> my ($x) = @_; >> return '!' if $x eq ' ' && !$level; >> $level++ if $x eq '['; >> $level-- if $x eq ']'; >> return $x; >>} >>$text =~ s/(.)/&parser($1)/eg; > > Czyli tak jak sie obawiałem, znaczej po znaczku jak w starym dobrym C ;) > Ale z drugiej strony czytelne to jest... > > Myslalem naj jakims rekurencyjnym s///eg ale jakos zmeczony za bardzo > jesteman na takie cuda :)
To ja sobie pozwole w ramach rozruszania mozgu po urlopowym lenistwie:
$_ = 'abc def [ghi jkl] [mno] [pqr]'; $wNawiasie = qr"\[(?:[^\[\]]*|(??{$wNawiasie}))*\]"; print join "!", /[^\[\]\s]+|$wNawiasie/g
Byloby czytelniejsze, gdyby najpierw mozna bylo jakies y/[]/<>/, a na koniec y/<>/[]/, ale nie wiem czy masz jakies znaczki w zapasie.
grizzley
Robert Szczygiel - 04-01-2006 09:34
Michał Szafrański wrote: > Można i tak: > $_ = "abc def [ghi jkl] [[mno] [pqr]]"; > $x = qr/\[(??{$x})\](??{$x})|[a-z ]+(??{$x})|/; > s/(\[$x\])| /$1||"!"/ge;
Nieźle. ;) Jak dla mnie jest to mało czytelne, ale jam elektronik. ;) Proponuję dolożyć do zestawu rozwiązań jeszcze jedno, może mało efektywne, ale też działa. ;)
s# # $`=~tr/[// - $`=~tr/]// ? ' ' : '!' #ge;
RobTM:) -- ----------------------------- REKLAMA --------------------------------- ---- Mapa Krakowa, ceny paliw w Krakowie: http://www.dobaku.pl -------- ---- Radio Taxi 9622 Dwójki: http://taxi.krakow.pl -------------------- ---- Masaż leczniczy, relaksacyjny: http://masaz.leczniczy.pl ---------
Maciej Misiak - 04-01-2006 09:34
Robert Szczygiel napisał(a): > > Proponuję dolożyć do zestawu rozwiązań jeszcze jedno, może mało > efektywne, ale też działa. ;) > > s# # $`=~tr/[// - $`=~tr/]// ? ' ' : '!' #ge;
Ech, czlowiek sie meczy, cuda na kiju wymysla, a tu taki przyjdzie, trzasnie jedno s/// i zadowolony No coz, zycie... :P W takim razie moze jeszcze modyfikacja zakladajaca, ze po zadnej spacji nie ma trzech znakow '$'
s# (??{$`=~tr/[// - $`=~tr/]// ? '$$$' : ''})#!#g
grizzley
Piotr Fusik - 07-01-2006 21:08
> Witam > jakos nie moge znalezc prostego rozwiazania na taka zamiane: > > przed: > abc def [ghi jkl] [[mno] [pqr]] > > po: > abc!def![ghi jkl]![[mno pqr] [stu vwx yz]] > > da sie to jednym s///? a jesli nie to? :)
Mnie zastanawia, z czego wynikają "stu vwx yz" itd.
Jeśli chodzi tylko o zamianę spacji poza nawiasami, to np. coś takiego: s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
=?ISO-8859-2?Q?Micha=B3_Szafra=F1ski?= - 07-01-2006 21:08
Piotr Fusik wrote: >>Witam >>jakos nie moge znalezc prostego rozwiazania na taka zamiane: >> >>przed: >>abc def [ghi jkl] [[mno] [pqr]] >> >>po: >>abc!def![ghi jkl]![[mno pqr] [stu vwx yz]] >> >>da sie to jednym s///? a jesli nie to? :) > > > Mnie zastanawia, z czego wynikają "stu vwx yz" itd. > > Jeśli chodzi tylko o zamianę spacji poza nawiasami, > to np. coś takiego: > s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge > >
Lub z wersji Roberta:
s#(??{$`=~tr/[//-$`=~tr/]//?"!":$"})#!#g
-- m.
Marcin Gryszkalis - 09-01-2006 10:12
Michał Szafrański wrote: >>> przed: >>> abc def [ghi jkl] [[mno] [pqr]] >>> po: >>> abc!def![ghi jkl]![[mno pqr] [stu vwx yz]]
> Piotr Fusik wrote: >> Mnie zastanawia, z czego wynikają "stu vwx yz" itd. z niczego, to jest dowolny tekst nie zawierajacy [ i ]
A czy moze szanowni autorzy mogliby dla podniesienia swiadomosci innych jakos krotko skomentowac rozwiazania?
> s#(??{$`=~tr/[//-$`=~tr/]//?"!":$"})#!#g
rozumiem, ze generujemy tutaj dynamicznie lewa strone s/// $` =~ tr/[// - $` =~ tr/]// ? "!" : $"
no tylko jesli wyrazenie jest ewaluowane zeby sprawdzic czy do czegos bedzie pasowac, to czym bedzie w tym momencie $`? Czy skoro wyrazenie jest greedy to pierwsza proba dopasowania wykonuje sie wzgledem calego stringa? Po czym perl poznaje, ze nasze wyraznie sie dopasowalo czy nie? no bo sama roznice tr-ow to rozumiem, jesli roznica jest 0 to liczba otwarc zgadza sie z iloscia zamkniec... [ufff chociaz tyle zrozumialem ;) ]
>> s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge Tutaj to jakby cos bardziej tradycyjnego czyli kod *po prawej* stronie s/// :) ale po co to $L? v33? !! to jeszcze pamietam z ktoregos z golfowych opisow...
pozdrawiam -- Marcin Gryszkalis, PGP 0x9F183FA3 jabber jid:mg@chrome.pl, gg:2532994 http://the.fork.pl
=?ISO-8859-2?Q?Micha=B3_Szafra=F1ski?= - 11-01-2006 09:16
Marcin Gryszkalis wrote: > >>s#(??{$`=~tr/[//-$`=~tr/]//?"!":$"})#!#g > > rozumiem, ze generujemy tutaj dynamicznie lewa strone s///
Nie do końca, bo wyrażenie już jest, tylko puste. A pusty ciąg pasuje pomiędzy każdymi dwoma znakami oraz na początku i końcu dopasowywanego tekstu. Dopiero po tym dopasowaniu, za każdym razem, obliczana jest zawartość (??{}). Można to łatwo sprawdzić przez:
s#(?{print "$`\n"})##g
> $` =~ tr/[// - $` =~ tr/]// ? "!" : $" > > no tylko jesli wyrazenie jest ewaluowane zeby sprawdzic czy do czegos > bedzie pasowac, to czym bedzie w tym momencie $`? Czy skoro wyrazenie > jest greedy to pierwsza proba dopasowania wykonuje sie wzgledem calego > stringa? Po czym perl poznaje, ze nasze wyraznie sie dopasowalo czy nie? > no bo sama roznice tr-ow to rozumiem, jesli roznica jest 0 to liczba > otwarc zgadza sie z iloscia zamkniec... > [ufff chociaz tyle zrozumialem ;) ] > > >>>s/ |(\[)|(])/($L+=!!$1-!!$2or$2)?$&:v33/ge > > Tutaj to jakby cos bardziej tradycyjnego czyli kod *po prawej* stronie > s/// :) ale po co to $L? v33? !! to jeszcze pamietam z ktoregos z > golfowych opisow... > $L to to samo co $level z rozwiązania, które podałem w innej części wątku. v33 to "!".
--
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
=?ISO-8859-2?Q?eksportuje_z_corela_do_bmp_albo_psd_?==?ISO-8859-2?Q?i_tylko_mi_sie_t=B3o_eksportuje?=
Adobe Illustrator - jak w wersji 11 zapisać plik w formacie wersji 10 albo 8?
[Postgres] jak zastapic brakujaca funkcje regexp_replace w PG wersji 8.0
[MySQL] REGEXP w FULL-TEXT SEARCH
[MySQL] REGEXP =?UTF-8?B?ZG9rxYJhZG5pZSBkd2Egem5ha2k=?=
[MySQL] REGEXP - dlaczego nie =?UTF-8?B?ZHppYcWCYQ==?=
[oracle] regexp - czemu nie działa?
Klatka z filmu DVD/DivX do JPG - jak albo czym?
sort + regexp
[MySQL] Regexpy
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|