出现特定单词后解析数字

时间:2014-11-18 03:18:06

标签: regex matlab

我正试图通过其基于文本的网站从国家气象局收集预测的高温。我试图从中提取信息的网站here.

到目前为止,我已经能够提取每天之后出现的第一个数字。大部分时间这是高温,但有时他们会在当天的预热温度之前放置降水量。我想找到一种方法来拉出" high"之后的数字。还应该注意的是,有时他们使用"高附近","高#34;或任何其他变体,因此它不一定是高位后的下一个字符串。

以下是我的代码。我打算在某个时间每天运行这个,所以我会在六天之后得到当前的预测。如果您在晚上运行此代码,您将获得接下来七天的预测温度,第一个温度实际上是指下周的预测。

我的最终目标是让它变得时髦,所以我确信这在其他格式中更容易实现,但我想直接使用Matlab。

url = 'http://forecast.weather.gov/MapClick.php?lat=40.48622&lon=-74.45181587699966&unit=0&lg=english&FcstType=text&TextType=1';
html = urlread(url);
DayForm = 'long';
today = clock;
today = today(:,3);
nvalue = zeros(6,1);
for i = 0:6
 [~, getDay] = weekday(today+i,DayForm);
 target = ['<b>' getDay ':'];
 [a,b] = regexp(html,'\d');
 strPos = find( a > strfind(html,target),1,'first');
 nvalue(i+1) = str2double(html(a(strPos):b(strPos)+1));
end

编辑:执行答案后,这是我更新的代码:

url = 'http://forecast.weather.gov/MapClick.php?lat=40.48622&lon=-74.45181587699966&unit=0&lg=english&FcstType=text&TextType=1';
html = urlread(url);
fcast = zeros(7,1);
target = 'with\sa\shigh\s\w*\s?([0-9]+)';
[~,b] = regexp(html,target);
for i = 1:7
 fcast(i) = str2double(html(b(i)-1:b(i)));
end

2 个答案:

答案 0 :(得分:1)

这有点复杂,因为它们偶尔会说像风速高达32英里/小时的风。以下是有效的,但可能会有更多的边缘情况未被解释:

high\D+(\d+)\D(?!mph)

这会搜索单词&#39; high&#39;,然后啜饮所有字符,直到它达到一个数字。它抓取组中的数字,然后抓取下一个非数字字符(这可以确保它抓取所有数字)。然后它使用负向前瞻来确保接下来的3个字母不是&#39; mph&#39; (这表明数字表示风,而不是温度)。

正如我所说,可能会有更多边缘情况,但它似乎适用于目前的网页。

答案 1 :(得分:1)

好吧,似乎matlab支持gnu扩展正则表达式,这是限制,这意味着MrAzzaman的答案可能无效。虽然他会考虑mph之前的单词为高,但以下正则表达式应该匹配并捕获您想要的数字到捕获组$1

with\sa\shigh\s\w*\s?([0-9]+)

找到with a high,然后是一个空格,然后是可能的单词,然后是另一个空格,后跟包含temp的捕获组。

应该有效