[英]Regex with Chinese characters
我正在搜索的text_
是:本周(3月25日-3月31日),国内油厂开始率继续下降,全国原料油厂压榨浓缩145600吨(出粕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"
出于某种原因,仍然不知道,我无法使用@WiktorStribiżew的评论解决方案,但最终工作:
oil <- str_extract(string = text_, pattern = perl("(?<=吨).*(?=吨)"))
# [1] "(出粕1157520吨,出油262080吨),较
oil <- str_extract(string = oil, pattern = perl("(?<=油)\\d+(?=吨)"))
# [1] 262080
尝试这个:
oil <- str_extract(string = text_, pattern = perl("(?<=出油).*(?=吨),较上周的))"))
因为简单吨
可能再后来再次出现你的文字,无法精确定位哪一部分,可能超过数据长度或导致数据类型的问题。
你检查你的ICU版本了吗? 之前遇到过这个问题,当时stringi的ICU版本是55,我尝试用ICU 58重新编译stringi,然后stringr对汉字也能正常工作。 现在stringi的新版本是用60以上版本的ICU编译的,问题应该已经解决了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.