Regex 在特定单词出现后解析出一个数字

Regex 在特定单词出现后解析出一个数字,regex,matlab,Regex,Matlab,我试图从国家气象局的文本网站上收集预测的高温。我试图从中获取信息的网站可以找到 到目前为止,我已经能够提取每天之后出现的第一个数字。大多数时候这是高温,但偶尔他们会把降水量放在一天的预测温度之前。我想找到一种方法来提取单词“high”后面的数字。还应该注意的是,有时它们使用“high-near”、“high-around”或任何其他变体,因此它不一定是high之后的下一个字符串 下面是我的代码。我打算每天在某个特定的时间运行它,因此我将在六天后得到当前天数的预测。如果您在晚上运行此代码,您将获得

我试图从国家气象局的文本网站上收集预测的高温。我试图从中获取信息的网站可以找到

到目前为止,我已经能够提取每天之后出现的第一个数字。大多数时候这是高温,但偶尔他们会把降水量放在一天的预测温度之前。我想找到一种方法来提取单词“high”后面的数字。还应该注意的是,有时它们使用“high-near”、“high-around”或任何其他变体,因此它不一定是high之后的下一个字符串

下面是我的代码。我打算每天在某个特定的时间运行它,因此我将在六天后得到当前天数的预测。如果您在晚上运行此代码,您将获得未来七天的预测温度,第一个温度实际上是指未来几周的预测

我的最终目标是把它放到trendy上,所以我相信这在其他格式中会更容易实现,但我想直接使用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

这有点复杂,因为他们偶尔也会说“风速高达32英里/小时”。以下是有效的,但可能还有更多未考虑的边缘情况:

high\D+(\d+)\D(?!mph)
这将搜索单词“high”,然后对所有字符进行“slurp”操作,直到它达到一个数字。它会抓取组中的数字,然后抓取下一个非数字字符(这确保它抓取所有数字)。然后,它使用一个负向前看,以确保接下来的3个字母不是“mph”(这表明该数字表示的是风,而不是温度)


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

看来matlab支持gnu扩展正则表达式,这是一个限制,这意味着MrAzzaman答案可能不起作用。虽然他解释了前面有high一词的
mph
,但下面的正则表达式应该匹配并捕获您想要捕获的数字到捕获组
$1

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

用high查找
,然后是一个空格,然后是可能的单词,然后是另一个空格,后面是包含temp的捕获组


它应该能用

谢谢!这很好用。据我所知,文本预测中始终会出现“高”,因此这是我最稳健的选择。MATLAB的正则表达式有限,但我给出的答案中的所有内容都得到支持,至少在我使用的版本中是如此。
high\D+(\d+)\D(?!mph)