Portál AbcLinuxu, 3. června 2024 20:30


Dotaz: perl - slovo rozděleno mezerami

25.2.2008 21:19 motorcb | skóre: 12
perl - slovo rozděleno mezerami
Přečteno: 331×
Odpovědět | Admin
Zdravim. Zpracovavam text,ktery je obcas psany zpusobem, ze mezi kazde pismeno ve slove se dava mezera.

$promena="Vitejne na mem webu. Jmenuji se F R A N T A a timto Vas zdravim pres internet!";

Jde mi o to aby se vsechny slova,ktera jsou delsi nez 5 pismen i s mezerami( A N D -3pismena,2mezery) predelali na slovo bez mezer :)

$promena="Vitejne na mem webu. Jmenuji se FRANTA a timto Vas zdravim pres internet!";

Nevedel by nekdo jak na to? Uz to zkousim tyden a zadny vysledek. Dik za jakykoliv nakopnuti :)
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.2.2008 22:49 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
Odpovědět | | Sbalit | Link | Blokovat | Admin
a) nájdený výraz bude "f r a n t a a"
b) s/(\w(?:\s+\w)+)/join '', split ' ', $1/ge
25.2.2008 23:06 maleprase | skóre: 28
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
a v kotli sem nasel kocku => avkotlisemnaselkocku
25.2.2008 23:10 Dunric | skóre: 21
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
ad b) s/(?:^|\s)(\w\s){5,}/' ' . (join "", (split " ",$&)) . " "/eg
In the garden sleeps a messenger ·
25.2.2008 23:26 Dunric | skóre: 21
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
s/(?:^|\s)(\w\s){4,}(?:\w|$)(?/' ' . (join '', (split ' ',$&)) . ' '/eg
In the garden sleeps a messenger ·
25.2.2008 23:01 Petr Holík
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
Odpovědět | | Sbalit | Link | Blokovat | Admin
$promena ~= s/(\w) (\w) (\w)/$1$2$3/g #odstrani mezery ze vsech slov co maji 3 pismena

$promena ~= s/(\w) (\w) (\w) (\w)/$1$2$3$4/g #odstrani mezery ze vsech slov co maji 4 pismena

analogicky dale. Slo by to napsat i jednim vyrazem, ale vyzadovalo by to by pokrocilou znalost PCRE a trosku ladeni, takze Vam doporuciji spise dopsat vyrazy v podobnem duchu pro slova do maximalniho poctu pismen. Pokud se tedy nejedna o nejake dlouhodobejsi reseni :) pak se samozrejme vyplani si precist o regulernich vyrazech a dat si tu praci to odladit.
26.2.2008 07:21 pht
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami

No, ve skutecnosti to neni tak tezke s temu "pokrocilymi znalostmi". Neni ani potreba provadet cachry se splitem, pokud si problem rozdelite na dve casti:

  1. Najit vhodny match toho prostrkaneho slova. Uz tu neco padlo, trochu jsem to otunil: /([A-Z](?: [A-Z]){2,})(?= |$)/. Vysvetleni:

    Prvni vnejsi zavorka je ten nas match (to prostrkane slovo). Zacina na velke pismeno a za tim pokracuje mezera a opet velke pismeno a to cele aspon dvakrat, aby byla splnena podminka peti znaku. Symboly ?: na zacatku zavorky zajistuji, aby se zavorka neulozila jako $2 atd. Posledni zavorka je positive lookahead assertion, tzn. prvni zavorka se matchuje pouze pokud za ni nasleduje to co je v te druhe, cili dalsi mezera nebo konec retezce (abychom nenasli neco jako A S D Fghj). Nicmene tim ze to je jen assertion tak to tu pripadnou mezeru neukousne, jak by to udelala normalni zavorka ( |$).

  2. Odstranit z toho mezery (zvladne kazdy: s/ //g)

Pak uz staci jen tyto dva kroky vhodne zkombinovat.

perl -pe 's/([A-Z](?: [A-Z]){2,})(?= |$)/do {$_ = $1; s, ,,g; $_;}/eg'
26.2.2008 09:09 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
aj vám (ako všetkým, aj mne) chýba kontrola nonword pred prvým ((?<!\w)
positive look after ((?= |$)) by som nahradil negative ((?!\w)) ... negative považuje za zhodu aj to, ak reťazec nepokračuje ($, resp ^)

s/((?<!\w)\w(?:\s\w){5,}(?!\w))/../ge

26.2.2008 15:22 pht
Rozbalit Rozbalit vše Re: perl - slovo rozděleno mezerami
jo, taky moznost. jen bych dodal k tomu cislu 5 ze puvodne chtel autor pet znaku vcetne mezer, coz prave dava tu moji dvojku.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.