删除出现在单词之外的模式

Remove pattern that occurs outside of words

我正在尝试从字符向量的末尾删除模式 'SO'。我 运行 使用下面的代码遇到的问题是它将删除 'SO' 的任何序列 case insensitive/just 删除整个字符串(与检测到的最后一个模式相比)。我的一个解决方案是进行一些手动清理并强制降低除最终 'SO' 之外的所有内容并使其区分大小写。

x <- data.frame(y = c("Solutions are welcomed, please SO # 12345")

x <- x %>% mutate(y = stri_replace_last_regex(x$y,"SO.*","",case_insensitive = TRUE)) # This will remove the string entirely - I'm not really sure why.  

期望的输出是:

'Solutions are welcomed, please'

我使用了看起来像 \b\SO{2}\b\b\D{2}*\b|[[:punct:]] 的正则表达式迭代 - 我相信答案可以通过设置单词边界来解决,但我不确定。第二个去掉了 SO,但我觉得如果其他地方有这样的字母顺序与措辞分开,也会被删除。我只需要删除最后一次出现的 SO 以及之后的所有内容,包括整个字符串中的标点符号。

任何关于这方面的指导我都会非常感激。

您可以使用 gsub 删除不需要的模式。

gsub("\sSO.+$", "", x$y)

[1] "Solutions are welcomed, please"

如果要概括为任意两个连续的大写字母,请使用 [[:upper:]]{2}

gsub("\s[[:upper:]]{2}.+$", "", x$y)

[1] "Solutions are welcomed, please"

更新:如果字符串中有多个“SO”,上述代码可能不准确

为了演示,我创建了另一个包含多个“SO”的字符串。在这里,我们捕获了从字符串开头 (^) 到最后一次出现“SO” (SO.+$) 之前的所有字符。这些字符串存储在第一个捕获组中(它是正则表达式 (.*))。然后我们可以使用 gsub 将整个字符串替换为第一个捕获组 (\1),从而摆脱最后一次出现的“SO”之后的所有内容。

x <- data.frame(y = "Solutions are SO welcomed, SO please SO # 12345")

gsub('^(.*)SO.+$', '\1', x$y)

[1] "Solutions are SO welcomed, SO please "
library(dplyr)
library(stringr)

x %>% 
  mutate(y = str_replace_all(y, 'SO.*', ''))

library(dplyr)
library(stringr)

x %>% 
  mutate(y = str_replace_all(y, 'SO\s\#\s\d*', ''))

输出:

                                y
1 Solutions are welcomed, please