我正在尝试str_extract_all
从stringr
软件包中使用R中的一些文本提取值,并且我想从perl的正则表达式中使用不匹配的组(?:...)
来提取并清除一行中的相关值。
运行此代码时:
library(stringr)
## Example string.
## Not the real string, but I get the same results with this one.
x <- 'WIDTH 4\nsome text that should not be matched.\n\nWIDTH 46 some text.'
## extract values
str_extract_all(x, perl('(?:WIDTH\\s+)[0-9]+'))
我想得到这个结果:
[[1]]
[1] "4" "46"
但是我得到这个:
[[1]]
[1] "WIDTH 4" "WIDTH 46"
我究竟做错了什么?
正则表达式仍然匹配WIDTH
–只是不将其放入捕获组。您的正则表达式等于
WIDTH\s+[0-9]+
您的代码提取与正则表达式匹配的整个子字符串。(非)捕获组不会更改此设置。
您可以使用后向断言来断言某个字符串位于当前位置之前,而不必将其包括在匹配的子字符串中:
(?<=WIDTH\s)[0-9]+
根据确切的正则表达式引擎,您不能在后视中使用变长模式。还有另一种形式可以允许这样做:
WIDTH\s+\K[0-9]+
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句