我正在寻找文字:本周(3月25日 – 3月31日),国内油厂开机率继续下降,全国各地油厂大豆压榨总量1456000吨(出粕1157520吨,出油262080吨),较上周的… [续]
crush <- str_extract(string = text_,pattern = perl("(?<=量).*(?=吨(出粕)")) meal <- str_extract(string = text_,pattern = perl("(?<=粕).*(?=吨,出)")) oil <- str_extract(string = text_,pattern = perl("(?<=出油).*(?=吨))"))
版画
[1] "1456000" ## correct [1] "1157520" ## correct [1] NA ## looking for 262080 here
为什么前两个匹配但不是最后一个匹配?我正在使用stringr库.
请注意,当前版本的stringr包基于ICU正则表达式库,并且不推荐使用perl().
请注意,lookbehind模式是固定宽度的,似乎ICU如何解析lookbehind模式中的第一个字母(由于某些未知原因无法计算其宽度).
由于您使用的是stringr,因此您可以依靠使用str_match实现的捕获来提取模式的一部分:
> match <- str_match(s,"出油(\\d+)吨") > match[,2] [1] "262080"
这样,您将来可以避免任何最终问题.此外,这些正则表达式执行得更快,因为在搜索字符串中的每个位置执行的模式中没有未锚定的lookbehind.
此外,您可以使用PCRE正则表达式与基数R:
> regmatches(s,regexpr("(?<=出油)\\d+(?=吨)",s,perl=TRUE)) [1] "262080"