【发布时间】:2019-06-05 15:55:59
【问题描述】:
我正在使用正则表达式来解析汽车名称。
由于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_replace( some_versions, ".*(Golf(?: SportsWagen)?).*", "\\1" ) -
或
sub(".*?Golf( SportsWagen)?.*", "Golf\\1", some_versions) -
为什么不使用
str_extract(some_versions, "Golf(?: SportsWagen)?")? (或者,"\\bGolf(?: SportsWagen\\b)?"匹配整个单词) -
@WiktorStribiżew 这个帮助我完成了这个特定的示例,但我无法满足我的下一个要求,即捕获
Cross Golf。为此,我可以与需要考虑其他角色的@G5W 合作。 -
str_extract(some_versions, "(?:Cross )?Golf(?: SportsWagen)?")?
标签: r regex tidyverse regex-group