在环视中使用量词 (R/stringr)
Using quantifiers in look-arounds (R/stringr)
我想从以下字符串中提取名称 John Doe
:
str <- 'Name: | |John Doe |'
我能做到:
library(stringr)
str_extract(str,'(?<=Name: \| \|).*(?= \|)')
[1] "John Doe"
但这涉及到输入大量空格,并且当空格数不固定时效果不佳。但是当我尝试使用量词 (+
) 时,出现错误:
str_extract(str,'(?<=Name: \| +\|).*(?= +\|)')
Error in stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) :
Look-Behind pattern matches must have a bounded maximum length. (U_REGEX_LOOK_BEHIND_LIMIT, context=`(?<=Name: \| +\|).*(?= +\|)`)
其他变体也是如此:
str_extract(str,'(?<=Name: \|\s+\|).*(?=\s+\|)')
str_extract(str,'(?<=Name: \|\s{1,}\|).*(?=\s{1,}\|)')
有解决办法吗?
怎么样:
首先我们删除 Name
然后我们用 space 替换所有特殊字符
最后 str_squish
它
Library(stringr)
str_squish(str_replace_all( str_remove(str, "Name"), "[^[:alnum:]]", " "))
[1] "John Doe"
另一个使用 base R 的解决方案:
sub("Name: \|\s+\|(.*\S)\s+\|", "\1", str)
# [1] "John Doe"
您也可以使用 \K
将到目前为止匹配的内容保留在正则表达式匹配之外。
Name: \|\h+\|\K.*?(?=\h+\|)
说明
Name: \|
匹配 Name: |
\h+\|
匹配1+个空格和|
\K
忘记目前匹配的是什么
.*?
匹配尽可能少的字符
(?=\h+\|)
正面前瞻,断言右侧多出 1+ 个空格,然后是 |
看到一个regex demo and a R demo.
例子
str <- 'Name: | |John Doe |'
regmatches(str, regexpr("Name: \|\h+\|\K.*?(?=\h+\|)", str, perl=T))
输出
[1] "John Doe"
我想从以下字符串中提取名称 John Doe
:
str <- 'Name: | |John Doe |'
我能做到:
library(stringr)
str_extract(str,'(?<=Name: \| \|).*(?= \|)')
[1] "John Doe"
但这涉及到输入大量空格,并且当空格数不固定时效果不佳。但是当我尝试使用量词 (+
) 时,出现错误:
str_extract(str,'(?<=Name: \| +\|).*(?= +\|)')
Error in stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) :
Look-Behind pattern matches must have a bounded maximum length. (U_REGEX_LOOK_BEHIND_LIMIT, context=`(?<=Name: \| +\|).*(?= +\|)`)
其他变体也是如此:
str_extract(str,'(?<=Name: \|\s+\|).*(?=\s+\|)')
str_extract(str,'(?<=Name: \|\s{1,}\|).*(?=\s{1,}\|)')
有解决办法吗?
怎么样:
首先我们删除 Name
然后我们用 space 替换所有特殊字符
最后 str_squish
它
Library(stringr)
str_squish(str_replace_all( str_remove(str, "Name"), "[^[:alnum:]]", " "))
[1] "John Doe"
另一个使用 base R 的解决方案:
sub("Name: \|\s+\|(.*\S)\s+\|", "\1", str)
# [1] "John Doe"
您也可以使用 \K
将到目前为止匹配的内容保留在正则表达式匹配之外。
Name: \|\h+\|\K.*?(?=\h+\|)
说明
Name: \|
匹配Name: |
\h+\|
匹配1+个空格和|
\K
忘记目前匹配的是什么.*?
匹配尽可能少的字符(?=\h+\|)
正面前瞻,断言右侧多出 1+ 个空格,然后是|
看到一个regex demo and a R demo.
例子
str <- 'Name: | |John Doe |'
regmatches(str, regexpr("Name: \|\h+\|\K.*?(?=\h+\|)", str, perl=T))
输出
[1] "John Doe"