stringr,str_extract:如何做正面回顾?
stringr, str_extract: how to do positive lookbehind?
很简单的问题。我只需要使用正则表达式正向后视来捕获一些字符串,但我没有找到一种方法。
这是一个例子,假设我有一些字符串:
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:" 部分,所以这就是 "positive lookbehind" 的用途:
> 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)
>
它抱怨需要一个 "bounded maximum length",但我不知道在哪里指定它。我如何使积极的后视工作?我可以在哪里指定这个 "bounded maximum length"?
我们可以使用正则表达式环视。回溯只会采用完全匹配。
str_extract(myStrings, "(?<=MFG:\s)\w+")
#[1] "acme" NA "initech"
您需要使用 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"
我使用 lookbehind 在 python 中编写了代码。如果解析器找到 MFG: 那么它将获取下一个单词
txt="MFG: acme, something else, MFG: initech"
pattern=r"(?<=MFG\:)\s+\w+"
matches=re.findall(pattern,txt)
for match in matches:
print(match)
输出:
acme
initech
很简单的问题。我只需要使用正则表达式正向后视来捕获一些字符串,但我没有找到一种方法。
这是一个例子,假设我有一些字符串:
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:" 部分,所以这就是 "positive lookbehind" 的用途:
> 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)
>
它抱怨需要一个 "bounded maximum length",但我不知道在哪里指定它。我如何使积极的后视工作?我可以在哪里指定这个 "bounded maximum length"?
我们可以使用正则表达式环视。回溯只会采用完全匹配。
str_extract(myStrings, "(?<=MFG:\s)\w+")
#[1] "acme" NA "initech"
您需要使用 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"
我使用 lookbehind 在 python 中编写了代码。如果解析器找到 MFG: 那么它将获取下一个单词
txt="MFG: acme, something else, MFG: initech"
pattern=r"(?<=MFG\:)\s+\w+"
matches=re.findall(pattern,txt)
for match in matches:
print(match)
输出:
acme
initech