繁体   English   中英

带中文字符的正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM