Regex Tidyverse,如果存在则如何捕获表达式

Regex Tidyverse, how to capture expression if exists

我正在使用正则表达式来解析汽车名称。
由于有很多 Golf 版本,我想删除它后面的所有内容,除了 Golf SportsWagen

我的尝试是:

> some_versions <- c("Golf A5", "Golf SportsWagen", "Cross Golf", "Golf A6")
> str_replace( some_versions, "Golf( SportsWagen)?", "Golf\1" )
[1] "Golf A5"   "Golf SportsWagen"   "Cross Golf"   "Golf A6"

但这给出了整个原始向量some_versions

相比之下,如果我 运行 我确实得到了预期的匹配:

> str_match(some_versions, "Golf( SportsWagen)?")
     [,1]               [,2]          
[1,] "Golf"             NA            
[2,] "Golf SportsWagen" " SportsWagen"
[3,] "Golf"             NA            
[4,] "Golf"             NA   

NA 没有匹配项。

我想得到的是:

> str_replace(some_versions, "pattern", "Golf\1")
> "Golf"  "Golf SportsWagen"   "Golf"   "Golf"

有谁知道我该如何解决这个问题?

此外,我的下一个要求是捕获 Cross Golf

谢谢。

我建议在这里使用 str_extract 而不是 str_replacestr_replace 替换它匹配的文本。 str_extract 从较长的文本字符串中提取 个匹配的子字符串。

要解决原始任务,您可以使用

str_extract(some_versions, "Golf(?: SportsWagen)?")
[1] "Golf"             "Golf SportsWagen" "Golf"             "Golf" 

如果 Golf 之前有 Cross,也提取 Cross Golf,使用

str_extract(some_versions, "(?:Cross )?Golf(?: SportsWagen)?")
[1] "Golf"       "Golf"       "Cross Golf" "Golf"

所以,(?:Cross )?Golf(?: SportsWagen)?匹配一个可选的Cross和后面的space,然后匹配Golf,然后是一个可选的序列space + SportsWagen 匹配。

将 space 替换为 \s+ 以匹配任何 1 个或多个白色 space 并用 \b 包裹单词,单词边界,如果需要将这些字符串作为整个单词进行匹配。

例如:

str_extract(some_versions, "\b(?:Cross\s+)?Golf(?:\s+SportsWagen)?\b")
[1] "Golf"             "Golf SportsWagen" "Cross Golf"       "Golf"