Автор Тема: RegExp в Perl  (Прочитано 5726 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AlekseyD

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« : 06 Мая 2006, 12:48:30 »
Здравствуйте!
Есть код html например


......


Нужно получить список слов заключенных в теги . Т.е. text1,text2....
Я это делаю так
@arr = ($html=~/
([^<]+)/g);

Все нормально работает. Но вот вопрос как мне получить только список слов из тега
одним регэкспом?
Я вообще использую библиотеку RegExp::Bind там все делаеться чуть проще.

@aa = RegExp::Bind->global_bind($html, qr/(?#[^<]+)/);

Т.е. в @aa я получу массив ссылок на хеши. @aa = ({teg_a=>text1},{teg_a=>text2}....)

Подскажите пожалуйста как мне получить только список слов из тега
...
одним регэкспом с помощью библиотеки RegExp::Bind или подобных ей.

Спасибо.

Оффлайн 09h

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 82
  • +0/-0
  • 0
    • Просмотр профиля
RegExp в Perl
« Ответ #1 : 06 Мая 2006, 14:10:54 »
хз что там за RegExp::Bind но поиск рулит ) я бы сделал так:
#!/usr/bin/perl -wT

$log = "./tt.txt";

open (LOG, "<$log") || Error(\'open\', \'file\');
@data = ;
close (LOG);

foreach (@data) {
if ($_ =~ /\\
/) {
$next = \'1\';
}
if ($_ =~ /\\<\\/div\\>/) {
$next = \'0\';
}
if ($next == \'1\') {
if ($_ =~ /\\/) {
$\' =~ /\\<\\/a\\>/;
$text = $text . $` . "\\n";
}
}
}

print "Content-type: text/html\\n\\n";
print $text;

Оффлайн xames

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 62
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« Ответ #2 : 06 Мая 2006, 14:36:33 »
undef $/;
$data=;

sub word
   {
      my ($data,$first_tag,$second_tag,$sd,@r) = @_;
      while($data =~ m#<$first_tag[^<>]*>(.+?)#isg)
         {
            $d=$1;
            while($d =~ m#<$second_tag[^<>]*>(.+?)#isg)
               {
                  push @r,$1;
               }
         }
      return @r;
   }

######################################

print word($data,\'div\',\'a\');

######################################

__DATA__

......

Оффлайн AlekseyD

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« Ответ #3 : 06 Мая 2006, 16:08:47 »
Ребят зачем такие извращения?
Можно сделать так
....
$aa = ($html=~/
([^<]+)
/g);
$aa = ($aa=~/([^<]+)/g);
и получаем ссылку на нужный массив. Но просто хотелось бы в одну строку это все втулить. :)

Оффлайн 09h

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 82
  • +0/-0
  • 0
    • Просмотр профиля
RegExp в Perl
« Ответ #4 : 06 Мая 2006, 17:49:09 »
здается мне что эти 2 строки выполняют поиск с заменой... поправь если ошибся.
а в моем примере изврата нету... единственное отличие от твоего в том что в моем примере значение "подопытной" переменной берется из файла и записывается в массив и поэтому foreach...

Оффлайн AlekseyD

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« Ответ #5 : 06 Мая 2006, 18:33:02 »
Цитировать
09h:
здается мне что эти 2 строки выполняют поиск с заменой... поправь если ошибся.

Да ты ошибаешься. Тут нет не какого поиска с заменой есть просто поиск. Где там стоит ...=~s///?
В твоем примере я бы сделал так (просто очень уж больно навороченная конструкция):
#!/usr/bin/perl -wT

$log = "./tt.txt";

open (LOG, "<$log") || Error(\'open\', \'file\');
my @data = ;
close (LOG);

my $data = join(\'\',@data);
my $aa = ($data=~/
([^<]+)
/g);
$aa = ($aa=~/([^<]+)/g);

Согласись намного короче и намного понетней?

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
RegExp в Perl
« Ответ #6 : 06 Мая 2006, 23:40:28 »
AlekseyD, мне кажется, Вы сами себе ставите задачу.
Страница для распарсивания не Ваша?
The documentations is your friend

Оффлайн AlekseyD

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« Ответ #7 : 08 Мая 2006, 11:35:25 »
Цитировать
NeoNox:
AlekseyD, мне кажется, Вы сами себе ставите задачу.
Страница для распарсивания не Ваша?


Да не моя. А это как то меняет дело?

Оффлайн Zerokool

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 22
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« Ответ #8 : 17 Мая 2006, 02:40:56 »
AlekseyD, так мы получим не ссылку на масив, а кол-во элементов, да не о том речь. Вам респект за знание регекспов и что-то противоположное за понимание логики их исполнения.
Не буду мудрствовать, только скажу, что одним регекспом обойтись можно, но не нужно. Поберегите ресурсы. Расчленяем это дело на два регекспа и исполняется в 5-10 раз быстрее. Можно расчленить еще, но это уже будет невозможно читать, так что ограничтесь двумя.

P.S. Судя по всему вы только с Питона? :)

Оффлайн AlekseyD

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
RegExp в Perl
« Ответ #9 : 21 Мая 2006, 15:38:34 »
Цитировать
Zerokool:
P.S. Судя по всему вы только с Питона?


Нет я с Perl. Посто я очень люблю когда все красиво и в одной строке. (хотя бывает конечно перумудрю. :) ) А вообще все зависит от конкретной задачи. Я для себя поставил задачу что бы был как можно более компактный код. Со скоростью да я понимаю что так будет на много медленей работать. Но такой задачи я себе не ставил.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28