Я столкнулся с другой проблемой, связанной с сайтом, который я пытаюсь очистить.
По сути, я удалил большую часть того, что мне не нужно, из содержимого страницы, и благодаря некоторой помощи, предоставленной здесь удалось выделить нужные мне даты. Большинство из них, кажется, работает нормально, несмотря на некоторые первоначальные проблемы с сопоставлением неразрывного пробела. Однако теперь у меня возникли трудности с окончательным регулярным выражением, которое предназначено для разделения каждой строки данных на поля. Каждая строка представляет цену индекса цен акций. Поля в каждой строке:
- Имя произвольной длины, состоящее из символов латинского алфавита и иногда запятой или амперсанда, без цифр.
- Число с двумя цифрами после запятой (абсолютное значение индекса).
- Число с двумя цифрами после запятой (изменение значения).
- Число с двумя цифрами после запятой, за которым следует знак процента (процентное изменение значения).
Вот пример строки до разделения: «Рыболовство, сельское и лесное хозяйство243,45-1,91-0,78% горнодобывающая промышленность360,74-4,15-1,14% строительство465,36-1,01-0,22% продукты питания783,2511,281,46% текстиль и одежда412,070,540. 13% Целлюлозно-бумажная промышленность333,31-0,29-0,09% Химическая промышленность729.406.010,83% "
Регулярное выражение, которое я использую для разделения этой строки, таково:
$mystr =~ s/\n(.*?)(\d{1,4}\.\d{2})(\-?\d{1,3}\.\d{2})(.*?%)\n/\n$1 == $2 == $3 == $4\n/ig;
Иногда это работает, но не в другое время, и я не могу понять, почему это должно быть. (Двойные знаки равенства в приведенном ниже примере используются, чтобы сделать разделение поля более заметным.)
Fishery, Agriculture & Forestry == 243.45 == -1.91 == -0.78%
Mining360.74-4.15-1.14%
Construction == 465.36 == -1.01 == -0.22%
Foods783.2511.281.46%
Я думал, что знак минус был проблемой для тех индексов, которые видели отрицательное изменение в цене индекса, но иногда это работает, несмотря на знак минус.
В. Почему последнее регулярное выражение, показанное ниже, не может последовательно разделить поля?
Ниже приведен пример кода.
#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use HTML::Tree;
my $url_full = "http://www.tse.or.jp/english/market/STATISTICS/e06_past.html";
my $content = get($url_full);
# get dates:
(my @dates) = $content =~ /(?<=dateFormat\(')\d{4}\/\d{2}\/\d{2}(?='\))/g;
foreach my $date (@dates) { # convert to yyyy-mm-dd
$date =~ s/\//-/ig;
}
my $tree = HTML::Tree->new();
$tree->parse($content);
my $mystr = $tree->as_text;
$mystr =~ s/\xA0//gi; # remove non-breaking spaces
# remove first chunk of text:
$mystr =~
s/^(TSE.*?)IndustryIndexChange ?/IndustryIndexChange\n$dates[0]\n\n/gi;
$mystr =~ s/IndustryIndexChange ?/IndustryIndexChange/ig;
$mystr =~ s/IndustryIndexChange/Industry Index Change\n/ig;
$mystr =~ s/% /%\n/gi; # percent symbol is market for end of line
# indicate breaks between days:
$mystr =~ s/Stock.*?IndustryIndexChange/\nDAY DELIMITER\n/gi;
$mystr =~ s/Exemption from Liability.*$//g; # remove boilerplate at bottom
# and here's the problem regex...
# try to split it:
$mystr =~
s/\n(.*?)(\d{1,4}\.\d{2})(\-?\d{1,3}\.\d{2})(.*?%)\n/\n$1 == $2 == $3 == $4\n/ig;
print $mystr;