Xpoint
   [напомнить пароль]

Помогите составить регулярное выражение

Метки: [без меток]
2010-06-14 08:50:38 [обр] Case[досье]

Из корявого html нужно выдрать текст (коэффициенты ставок в http://odds.marathonbet.com/od......2_722763&r=2_722735&r=2_722733)
Мой шаблон <b>([0-9].*)</b>
Часть html

<div class=cap>Теннис. Турнир ATP. Истбурн. Трава</div></a><br><pre><hr color=#CC0033 noshade> Дата   Событие        <b>Поб.1 </b> Поб.2  <b> 2:0 </b>  2:1   1:2    0:2   <b>фора1=>кф1 </b> фора2=>кф2  <b>тотал </b> мен.  бол.
<hr color=#CC0033 noshade> 14/06  <b id=r>1)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834885)><u>Истомин</u></a></b>      <b> 1.25 </b>  4.45 ==#<b>1.65 </b> 4.80   9.00   7.00  <b>-4.5=>1.90 </b> +4.5=>2.00  <b> 21.0 </b>#== 1.90  2.00
 14:30  <b id=r>2)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834885)><u>Шванк</u></a></b>        <b>  <input type=radio name=r1024 value="nqQzx812nqPBH37YK1_3ABWAMy_p"> </b>   <input type=radio name=r1024 value="x81pnvUsxo4jByS0z0gjGC7YKmg1">  <b> <input type=radio name=r1024 value="pIh8krQJp90qF0WyE7^SYDVyUn^I"> </b>  <input type=radio name=r1024 value="TVvJ_TZ8UVrHq_cS8IE5mvMGuIEb">    <input type=radio name=r1024 value="qxD31OdArMt1TDqvUGVQYw^kUGVK">    <input type=radio name=r1024 value="rtX70OuEqMM5UDv.WnessD6pWneA">   <b>    <input type=radio name=r1024 value="o9ylwvlW.oDnAykdBnFQvHlxfjxE">    </b>     <input type=radio name=r1024 value="Uf6RYUqmSWsPd^dKgxdgexug2NwW">     <b>      </b>  <input type=radio name=r1024 value="sE^.VVJccTju3tL70spKbI59kvhQ">   <input type=radio name=r1024 value="xHh5mjlGvpD7EmkuFSkIOygrCB7S"> 
 
 14/06  <b id=r>1)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834888)><u>Майер Л.</u></a></b>     <b> 1.35 </b>  3.50  <b>     </b>                     <b>           </b>             <b>      </b> 
 14:30  <b id=r>2)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834888)><u>Робер</u></a></b>        <b>  <input type=radio name=r1027 value="u8hjnJAYu8d.C1G5z0GlDkOWHzG8"> </b>   <input type=radio name=r1027 value="oY58krMJoI0hGzKfDmGlDkOWHzG8">  <b>     </b>                     <b>           </b>             <b>      </b> 
 
 14/06  <b id=r>1)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834884)><u>Симон</u></a></b>        <b> 1.65 </b>  2.38  <b>2.50 </b> 4.50   5.10   4.00  <b>-2.5=>1.90 </b> +2.5=>2.00  <b> 22.5 </b> 1.95  1.95
 14:30  <b id=r>2)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834884)><u>Королев</u></a></b>      <b>  <input type=radio name=r1029 value="VV^CtDv1VV_D9_u_qXlxfjx_vHl2"> </b>   <input type=radio name=r1029 value="op19kjAKo94eG0GlDA_3ABWAMy_u">  <b> <input type=radio name=r1029 value="UFvM^wRgU6nJqgTQ9OcS9LTy5bcL"> </b>  <input type=radio name=r1029 value="TVeO^DZhUVbHq_cS8OLW8LDl4bLH">    <input type=radio name=r1029 value="xoyvnZMXuH8xCAK6ABgKOA79CagT">    <input type=radio name=r1029 value="mj1tvpQbyrwZN2WALyO7zBGELyOo">   <b>    <input type=radio name=r1029 value="Q7fDc466WfCC8b0XrpU3Rf.O^Efa">    </b>     <input type=radio name=r1029 value="RnRK_DJ9TVgLr_LW8uLl8LDl4bLH">     <b>      </b>  <input type=radio name=r1029 value="1bmAhum36eUFY7ftZ1WnHmOnDCGJ">   <input type=radio name=r1029 value="1_uAhum36eUFY7ftZ1WnHmOnDCGJ"> 
 
 14/06  <b id=r>1)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834889)><u>Лацко</u></a></b>        <b> 1.40 </b>  3.25  <b>2.10 </b> 4.00   7.00   5.00  <b>-3.5=>2.00 </b> +3.5=>1.90  <b> 22.0 </b> 1.95  1.95
 17:10  <b id=r>2)<a title="статистика" id=r1 href=javascript:OpenMatchStat(834889)><u>Себальос</u></a></b>     <b>  <input type=radio name=r1025 value="ajATo9lfajzWMakLNkOWHzGlDkOL"> </b>   <input type=radio name=r1025 value="yj1YjpQjyr4ZN2WAMP7pGkgsKz72">

Но естественно у меня получается не тот результат иза их корявого кода

<b>1.65 </b> 4.80   9.00   7.00  <b>-4.5=>1.90 </b> +4.5=>2.00  <b> 21.0 </b>
--> 1.65 </b> 4.80   9.00   7.00  <b>-4.5=>1.90 </b> +4.5=>2.00  <b> 21.0 
<b>2.50 </b> 4.50   5.10   4.00  <b>-2.5=>1.90 </b> +2.5=>2.00  <b> 22.5 </b>
--> 2.50 </b> 4.50   5.10   4.00  <b>-2.5=>1.90 </b> +2.5=>2.00  <b> 22.5 
<b>2.10 </b> 4.00   7.00   5.00  <b>-3.5=>2.00 </b> +3.5=>1.90  <b> 22.0 </b>
--> 2.10 </b> 4.00   7.00   5.00  <b>-3.5=>2.00 </b> +3.5=>1.90  <b> 22.0 
<b>3.10 </b> 4.20   4.50   3.50  <b>           </b>             <b> 22.5 </b>
--> 3.10 </b> 4.20   4.50   3.50  <b>           </b>             <b> 22.5

В итоге должен получится например такой массив для одного события: 1.25 4.45 1.65 4.80 9.00 7.00 -4.5=>1.90 +4.5=>2.00 21.0 1.90 2.00

спустя 4 минуты [обр] Case[досье]
тестю здесь http://realcode.ru/regexptester/
спустя 3 часа 34 минуты [обр] Dmitry[досье]

<b>(\s*\d+[.:]\d+\s*)</b>

?

спустя 4 часа 56 минут [обр] Case[досье]
опять же результат не тот, дело в том что не всегда присутствует тег <b>, как я понял нужно искать все числа с точкой типа этого наверно [+-]?\d+\.?\d, но у него вывод тоже не тот
спустя 3 часа 14 минут [обр] zloyrusskiy(0/3)[досье]
use 5.012;
use HTML::Parser;

my $p = HTML::Parser->new(
   api_version => 3,
   report_tags => [ 'a' ],
   text_h => [ sub { push @{$_[0]->{r}},$_[1] =~ /(\d+\.\d+)|([+-\d\.]+=>[+-\d\.]+)/g }, 'self,dtext' ],
   start_h => [
      sub {
         my $arr = \@{$_[0]->{r}};
         @$arr = grep defined $_,@$arr;
         say "@$arr";
         @$arr = ()
      },
      'self,tagname'
   ]
);

$p->parse_file('input.txt');

Вывод с данного куска разметки:

1.25 4.45 1.65 4.80 9.00 7.00 -4.5=>1.90 +4.5=>2.00 21.0 1.90 2.00

1.35 3.50

1.65 2.38 2.50 4.50 5.10 4.00 -2.5=>1.90 +2.5=>2.00 22.5 1.95 1.95

1.40 3.25 2.10 4.00 7.00 5.00 -3.5=>2.00 +3.5=>1.90 22.0 1.95 1.95

спустя 1 час 36 минут [обр] Case[досье]
Спасибо большое, не помешало б небольшое объяснение (вообще пишу на си с использование PCRE, но видимо нужно искать другую библиотеку или часть кода писать на перле, что не хотелось бы)
спустя 1 час 2 минуты [обр] zloyrusskiy(0/3)[досье]

Тогда опишу регулярку /(\d+\.\d+)|([+-\d\.]+=>[+-\d\.]+)/g

скобочки - захват найденного выражения в буфер
\d - поиск цифры

(\d+\.\d+) - ищется последовательность цифр + точка + ещё последовательность цифр и забирается в буфер
| - ИЛИ

([+-\d\.]+=>[+-\d\.]+)

тут элементы:
( - захват в буффер
[+-\d\.]+ - ищем последовательность символов +,-,. или цифры
=> - просто указывается что мы ищем => последовательность
[+-\d\.]+
)

модификатор 'g' в регулярном выражении используется для захвата всех подходящих выражений и отдача их в виде списка

А вообще писать парсеры лучше на Perl, он идеально для этих целей предназначен и имеет интерфейсы для связи с кодом на языке C.

спустя 1 час 40 минут [обр] Case[досье]
Спасибо ещё раз :)
Powered by POEM™ Engine Copyright © 2002-2005