非常简单的问题。我只需要使用正则表达式正向后观捕获一些字符串,但我没有办法做到这一点。
这是一个例子,假设我有一些字符串:
library(stringr)
myStrings <- c("MFG: acme", "something else", "MFG: initech")
我想提取带有“MFG:”
前缀的单词> result_1 <- str_extract(myStrings,"MFG\\s*:\\s*\\w+")
>
> result_1
[1] "MFG: acme" NA "MFG: initech"
几乎这样做了,但我不想包含“MFG:”部分,所以这就是“积极的观察背景”:
> result_2 <- str_extract(myStrings,"(?<=MFG\\s*:\\s*)\\w+")
Error in stri_extract_first_regex(string, pattern, opts_regex = attr(pattern, :
Look-Behind pattern matches must have a bounded maximum length. (U_REGEX_LOOK_BEHIND_LIMIT)
>
它抱怨需要“有限的最大长度”,但我没有看到在哪里指定。我如何做出积极的外观工作?确切地说,我可以指定这个“有界最大长度”吗?
答案 0 :(得分:5)
您需要使用str_match
,因为“lookbehind”的模式是文字,而您只是不知道空格的数量:
> result_1 <- str_match(myStrings,"MFG\\s*:\\s*(\\w+)")
> result_1[,2]
##[1] "acme" NA "initech"
您需要的结果将在第二列中。
请注意,此处不能使用str_extract
,因为该函数会删除捕获的值。
还有一个好处:lookbehind不是无限宽度,但在ICU正则表达式中它是约束宽度。所以,这也有效:
> result_1 <- str_extract(myStrings,"(?<=MFG\\s{0,100}:\\s{0,100})\\w+")
> result_1
[1] "acme" NA "initech"
答案 1 :(得分:1)
我们可以使用正则表达式的外观。外观只需要完全匹配。
str_extract(myStrings, "(?<=MFG:\\s)\\w+")
#[1] "acme" NA "initech"