我正在寻找text_
:本周(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
库。
答案 0 :(得分:2)
请注意,当前版本的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"
答案 1 :(得分:1)
出于某种原因,仍然不知道,我无法使用@WiktorStribiżew的评论解决方案,但最终工作:
oil <- str_extract(string = text_, pattern = perl("(?<=吨).*(?=吨)"))
# [1] "(出粕1157520吨,出油262080吨),较
oil <- str_extract(string = oil, pattern = perl("(?<=油)\\d+(?=吨)"))
# [1] 262080
答案 2 :(得分:0)
试试这个:
oil <- str_extract(string = text_, pattern = perl("(?<=出油).*(?=吨),较上周的))"))
由于简单的吨
可能会再次出现在您的文本中,无法精确定位哪个部分,可能超出数据长度或导致数据类型问题。