【问题标题】:Regex Tidyverse, how to capture expression if exists正则表达式 Tidyverse,如果存在,如何捕获表达式
【发布时间】: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


【解决方案1】:

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

要解决原来的任务,你可以使用

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

如果CrossGolf 之前也可以提取Cross Golf,请使用

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

所以,(?:Cross )?Golf(?: SportsWagen)? 匹配可选的Cross 和它后面的空格,然后匹配Golf,然后匹配可选的空格序列+SportsWagen

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

例如:

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

【讨论】:

  • 谢谢。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多