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_replace
。 str_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"
我正在使用正则表达式来解析汽车名称。
由于有很多 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_replace
。 str_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"