在环视中使用量词 (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"