Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по шаблонам (рег выражения), Тема про поиск слов по шаблонам. 
:(
    Опции темы
Jeni
Дата 8.2.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



Добрый день.
Тема про поиск слов по шаблонам.
Тема обсуждалась частично в другом топике, но…
---
К примеру есть текст:
price=много денюжки time=срочно date=завтра land=Бабруйский лес

Надо по шаблонам (они выделены жирным текстом) найти слова, которые им присволи (они простым текстом, могут быть как русским текстом, так и на английском)
В том другом топике после обсуждения было предложено реализовать образно в таком коде:
Код

#!/usr/bin/perl -w

use CGI qw(:standard);
use LWP::Simple;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");

my $page = get 'file.txt’; # чтение

# фрагмент блока
$page =~ /price=(\w+)  time=(\w+) date=(\w+)  land=(\w+)/i; # парсинг
print header(-type => 'text/html; charset=windows-1251');
my $price = $1;
my $time = $2;
my $date = $3;
my $land = $4;
print qq(<b>price =</b> $1, <b>time =</b> $2, <b>date =</b> $3, <b>land =</b> $4 ); # смотрим что получилось

Но… если реализовать так, то браузер просто отображает список шаблонов:
price time date land
То есть как бы пусто, ничего не нашел, пустые поля, или ничего не присвоил… 
Ладно, попробовал упростить и чуток порезал от «# фрагмент кода»
Код

#!/usr/bin/perl -w

use CGI qw(:standard);
use LWP::Simple;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");

my $page = get 'file.txt’; # чтение

# фрагмент блока
$page =~ /time=(\w+)/i; # парсинг
print header;
my $price = $1;
print qq(<b>price =</b> $1); # смотрим что получилось
И?
А вот теперь всё отлично, сразу получаю:
time=срочно

То есть, если я задала сразу поиск по нескольким шаблонам – то не ищет (?), а когда задаю одно слово – находит прекрасно в любом месте.
Плиз – в чем грабли?
Почитала справочники по регулярным выражениям – не нашла в чем причина =( А может просто не понимаю где там искать, инфы выше крыши и крыша уже едет =( smile 
И еще… Если задать в моем случае поиск по шаблону «price», которому присваивается два слова через пробел «много мяса», то то найдет только первое слово "много"… Второго связанного слова ("мяса") не видит, а надо… Причем там может быть как два, так и три и четыре слова, а может и одно быть =(
Но все-таки более приоритетно – именно поиск по нескольким разным постоянным шаблонам…
Спасибо.

P.S. Хнык!  smile  smile 

PM MAIL   Вверх
AlexPet
Дата 8.2.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Неправильное регулярное выражение для поиска
Попробуйте:
Код

$page =~ /^\s*price=\s*(\w.*\w)\s+time=\s*(\w.*\w)\s+date=\s*(\w.*\w)\s+land=\s*(\w.*\w)\s*$/i

PM MAIL ICQ Jabber   Вверх
Jeni
Дата 8.2.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



Цитата(AlexPet @ 8.2.2008,  14:43)
Неправильное регулярное выражение для поиска
Попробуйте:
Код

$page =~ /^\s*price=\s*(\w.*\w)\s+time=\s*(\w.*\w)\s+date=\s*(\w.*\w)\s+land=\s*(\w.*\w)\s*$/i

то AlexPet

Поменяла строку как вы сказали, получила снова пустые поля =(
price=  time= date=  land=
PM MAIL   Вверх
ginnie
Дата 8.2.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Jeni,  может так сработает
Код

$page =~ /price=(.+?)\s+time=(.+?)\s+date=(.+?)\s+land=(.+)/oi




--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
AlexPet
Дата 8.2.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Видимо, ошибка была не только с регулярными выражениям, но и в чем-то другом...
У меня:
Код

#!/usr/bin/perl

use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");

$page = 'price=много денюжки time=срочно date=завтра land=Бабруйский лес';

$page =~ /^\s*price=\s*(\w.*\w)\s+time=\s*(\w.*\w)\s+date=\s*(\w.*\w)\s+land=\s*(\w.*\w)\s*$/i;
print "price=$1\ntime=$2\ndate=$3\nland=$4\n";

Вывод:
Код

price=много денюжки
time=срочно
date=завтра
land=Бабруйский лес

PM MAIL ICQ Jabber   Вверх
Jeni
Дата 8.2.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



AlexPet

попробовала ваш вариант "как есть" - работает с вашим примером.
Но когда делаю под свои данные - не работает.
Разница в чем?
Вы объявляете текст уже в тексте скрипта, я же текст читаю с чужой WEB страницы чужого домена...
Чтение идет прекрасно, никаках проблем
Я сделала в скрипте чтоб сперва отображалось чтение print qq($page); и вижу что читается текст без проблем, псоле чего сразу же идет код по поиску по шаблонам - и я получаю пустые значения =((
Кстати что еще получила, может в этом соль.
Чужая страница отображается в браузере как:
price=много денюжки time=срочно date=завтра land=Бабруйский лес
Но когда я просматриваю страницу в HTML коде, то вижу воо что:
price=много денюжки
time=срочно
date=завтра
land=Бабруйский лес
То есть "внутри" слова расположены не в ряд, а с новой строки и вообще никаких тегов типа <br> - ничего...

Добавлено через 5 минут и 30 секунд
ginnie 

Вашу версию попробовала - аналогично как и другие, пустяе поля =(

Добавлено через 8 минут и 3 секунды
Насколько я понимаю (подозреваю), при $page = get("http://web.ru/text.htm"); чтение идет не буквально как мы видим, а наверно "изнутри", то есть из html кода запрашиваемой страницы....  smile 
PM MAIL   Вверх
AlexPet
Дата 8.2.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Цитата(Jeni @  8.2.2008,  15:39 Найти цитируемый пост)
Чужая страница отображается в браузере как:
price=много денюжки time=срочно date=завтра land=Бабруйский лес
Но когда я просматриваю страницу в HTML коде, то вижу воо что:
price=много денюжки
time=срочно
date=завтра
land=Бабруйский лес

Покажите, как вы загружаете текст страницы и куда.
Если у вас одна переменная под весь текст (с переносами строк), то вместо
Код

$page =~ /^\s*price=\s*(\w.*\w)\s+time=\s*(\w.*\w)\s+date=\s*(\w.*\w)\s+land=\s*(\w.*\w)\s*$/i;

нужно расставить переносы строк (и, возможно, возврат кареток):
Код

$page =~ /price=\s*(\w.*\w)\s*\ntime=\s*(\w.*\w)\s*\ndate=\s*(\w.*\w)\s*\nland=\s*(\w.*\w)\s*/i;

(может быть, вместо \n придется поставить \r\n)

Это сообщение отредактировал(а) AlexPet - 8.2.2008, 15:58
PM MAIL ICQ Jabber   Вверх
Jeni
Дата 8.2.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



А "тама" изнутри слова расположены не в строчку получается...
Но все таки хоть одно слово он должен прочитать в первой строке price=много денюжки  smile  а не читает !  smile

Добавлено через 3 минуты и 29 секунд
AlexPet

вот так в скрипте перед парсингом

Код

my $page = get "http://www.web.ru/?text.pl=text=2008"; 


Добавлено через 5 минут и 25 секунд
ссылка условная, при юзе в IE браузере отображается:

Код

price=много денюжки time=срочно date=завтра land=Бабруйский лес


при просмотре HTML:

Код

price=много денюжки
time=срочно
date=завтра
land=Бабруйский лес

PM MAIL   Вверх
Jeni
Дата 8.2.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



AlexPet 

правила с тем, как вы показали, пробовала и с \r\n
все равно - пусто, отображает:
Код

price=  time= date=  land= 


Добавлено @ 16:10
Итоговый на данный момент код:
Код

#!/usr/bin/perl -w

use CGI qw(:standard);
use LWP::Simple;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");

print header(-type => 'text/html; charset=windows-1251');
my $page = get "http://www.web.ru/?text.pl=text=2008";
$page =~ /price=\s*(\w.*\w)\s*\r\ntime=\s*(\w.*\w)\s*\r\ndate=\s*(\w.*\w)\s*\r\nland=\s*(\w.*\w)\s*/i;
print qq($page<br><br><br>);
print "price=$1\ntime=$2\ndate=$3\nland=$4\n";


получаем в браузере:
Код

price=много денюжки time=срочно date=завтра land=Бабруйский лес



price= time= date= land= 


 smile  smile 
P.S. Хнык!\n;

Это сообщение отредактировал(а) Jeni - 8.2.2008, 16:12
PM MAIL   Вверх
AlexPet
Дата 8.2.2008, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: 1
Всего: 1



Дайте адрес той страницы, и как Вы получаете эту страницу (подозреваю, что $page = LWP::Simple::get();)
А то гадать можно долго
PM MAIL ICQ Jabber   Вверх
amg
  Дата 8.2.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Код

$page = 'price=много денюжки time=срочно date=завтра land=Бабруйский лес';

@a = map { [split] } split /=/, $page;
%a = map { pop(@{$a[$_-1]}) => "@{$a[$_]}"} reverse 1..$#a;

print "$k => $v\n" while (($k,$v) = each %a);
Эк я извратился. smile 



Это сообщение отредактировал(а) amg - 8.2.2008, 16:19
PM MAIL   Вверх
Jeni
Дата 8.2.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



Цитата(amg @ 8.2.2008,  16:18)
Код

$page = 'price=много денюжки time=срочно date=завтра land=Бабруйский лес';

@a = map { [split] } split /=/, $page;
%a = map { pop(@{$a[$_-1]}) => "@{$a[$_]}"} reverse 1..$#a;

print "$k => $v\n" while (($k,$v) = each %a);
Эк я извратился. smile

аха, вот это получилось с вашего фрагмента

Код

land => Бабруйский лес time => срочно date => завтра price => много денюжки 


ща попробую под свои масики переделать... А вдруг прокатит.  smile

Добавлено через 9 минут и 50 секунд
amg

в принципе ваш фрагмент вроде как работает, то есть он вытащил ВСЁ подряд, но и перемешал это всё в какой то хаос, то есть местами попеременял, но логика осталась, то есть каждому что было присвоено - всё на месте...
Уже легче стало, значит есть шансы разобраться теперь, буду анализировать и думать
 smile  smile  smile

Добавлено через 12 минут и 14 секунд
Я хотела сказать, что мне надо не всё что там есть (там массив около 90 перем енных), а именно выборочно то, что мне надо, ну как уже писала выше: есть какое то постоянная $фифа, которой присваивается какие либо рандомные значения. Спасибки, лед тронулся вроде?  smile 
PM MAIL   Вверх
Jeni
Дата 8.2.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 3.2.2008

Репутация: нет
Всего: нет



Может есть смысл сперва создать промежуточный массив сразу после чтения текста и потом уже рабоать только с образованным массивом? То есть не с данными удаленной web страницы, а именно с уже нашим массивом и из него сделать выборку необходимых данных, ну тех, что я написала выше... Ась?  smile  smile 
PM MAIL   Вверх
PanamOS
Дата 8.2.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Jeni, дай пример файла, а лучше ссылку на ту страницу. А регэксп мог не работать банально из-за кодировок. Ведь не известно точно ли там ср1251.
PM MAIL   Вверх
PanamOS
Дата 8.2.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.1.2008

Репутация: нет
Всего: нет



Ну вот показал(а) проблему и сразу стало ясно все с решением
Код

#!/usr/bin/perl -w

use CGI qw(:standard);
use LWP::Simple;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");

my $page = get 'http://price.ru/1.html'; # забираем

my (%hash) = $page =~ /(\w+)=(\w+)/gi; # заносим все ключи и значения в хеш
                                          #или
my (@arr) = $page =~ /\w+=(\w+)/gi;    # заносим все значения в массив


print header(-type => 'text/html; charset=windows-1251');

print qq(<b>price =</b> $hash{'price'}); # печатаем нужные значения из хеша
print qq(<b>price =</b> $arr[1]); # печатаем нужные значения из массива


А если надо что-то конкретное, как в первом примере, то
Код

#!/usr/bin/perl -w

use CGI qw(:standard);
use LWP::Simple;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.CP1251");

my $page = get 'http://price.ru/1.html'; # забираем

my (@arr) = $page =~ /price=(\w+).*?size=(\w+)/is;    # заносим все значения в массив

print header(-type => 'text/html; charset=windows-1251');
print @arr;# печатаем его


Это сообщение отредактировал(а) PanamOS - 8.2.2008, 21:16
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0723 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.