如何删除R字符串中最后一个空格之前的所有字符,但某些字符序列除外?

2nc8po8w  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(137)

我使用了以下代码来删除R字符串中最后一个空格之前的所有字符:gsub(".*\\s", "", "Big Dog")返回“Dog”,这是完美的。
我怎样才能避免某些模式被删除呢?例如,假设我总是想保留“Big Dog”,那么如果我有字符串“Look at that crazy Big Dog”,运行gsub()(或其他代码)返回“Big Dog”,并保留Big和Dog之间的空白。在完整代码中,这适用于“Big Dog”的等价物不是动态的,所以硬编码“Big Dog”是可以的。“Big Dog”也总是占据字符串中的最后位置。

pexxcrt2

pexxcrt21#

由于您事先不知道Dog,因此可以使用

sub("^.*?((?:\\bBig\\s+)?\\S+)$", "\\1", text)

请参阅regex demo。注意sub函数的用法,您只需要在字符串中搜索和替换一次。

  • 详细信息 *:
  • ^-字符串开始
  • .*?-尽可能少的零个或多个字符
  • ((?:\bBig\s+)?\S+)-第1组:
  • (?:\bBig\s+)?-整个字Big\b是字边界)和一个或多个空白字符(\s+)的可选序列
  • \S+-一个或多个非空白字符
  • $-字符串结束。

\1替换将组1中的值放回结果中。
请参见R demo

x <- c("Look at that crazy Dog", "Look at that crazy Big Dog")
sub("^.*?((?:\\bBig\\s+)?\\S+)$", "\\1", x)
# => [1] "Dog"     "Big Dog"
kmbjn2e3

kmbjn2e32#

假设您知道不想在字符串末尾替换的所有单词和短语,您可以使用以下白名单方法:

input <- c("Look at that crazy Dog", "Look at that crazy Big Dog")
keep <- c("Big Dog", "Dog")
regex <- paste0(".*?\\b(", paste(keep, collapse="|"), ")$")
output <- sub(regex, "\\1", input)
output  # [1] "Dog"     "Big Dog"

相关问题