【问题标题】:Selectively removing trailing string选择性地删除尾随字符串
【发布时间】:2017-12-05 06:37:46
【问题描述】:

我想删除最后一个字母“O”,除了单词“HELLO”的一部分。

我试过这样做:

例子:

a <- c("HELLO XO","DO HELLO","TWO XO","HO")
gsub("[^HELLO]O\\>","",a)

[1] "HELLO " " HELLO" "T " "HO"

但我想要

"HELLO X" "D HELLO" "TW X" "H"

【问题讨论】:

  • 你的意思是单词边界还是单词的最后一个字母?你想从fO.BA这个字符串中删除O吗?

标签: r regex gsub


【解决方案1】:

尝试使用以下模式替换:

\b(?!HELLO\b)(\w+)O\b

这表示断言单词HELLO 不会作为单词出现,然后捕获所有内容,直到最后的O,如果它出现的话。然后,它替换为已删除的可选最终 O

\b          - from the start of the word
(?!HELLO\b) - assert that the word is not HELLO
(\w+)O      - match a word ending in O, but don't capture final O
\b          - end of word

如果发生匹配,捕获组将包含整个单词减去最后的 O。

代码:

a <- c("HELLO XO","DO HELLO","TWO XO","HO")
gsub("\\b(?!HELLO\\b)(\\w+)O\\b", "\\1", a, perl=TRUE)
[1] "HELLO X" "D HELLO" "TW X"    "H"

请注意,我们必须使用 gsub 启用 Perl 模式 (perl=TRUE) 才能使用负前瞻。

Demo

【讨论】:

  • 你不喜欢我的编辑吗?对不起,不是故意的!
  • @aaaidan 没问题,你是对的,它需要一个解释。
  • 我想要,你能给我解释一下吗
  • 我给出了更详细的解释。
【解决方案2】:

使用正则表达式交替运算符|

a <- c("HELLO XO","DO HELLO","TWO XO","HO")
gsub("(HELLO)|O(?!\\S)", "\\1", a, perl=T)
# [1] "HELLO X" "D HELLO" "TW X"    "H"      

(HELLO)|O 这个正则表达式做了两件事,

  1. 首先它会捕获所有HELLO 字符串。

  2. 匹配所有剩余的0,后面没有非空格字符。

【讨论】:

  • 这很聪明!你能拼出来吗?
【解决方案3】:

您的正则表达式完全正确。[^HELLO] 表示除HELO 之外的任何字符。但是你只需要在O 之前只需要HELL。因此,您应该使用以下表达式:

a <- c("HELLO XO","DO HELLO","TWO XO","HO")
gsub("(?<!\\bHELL)O\\b", "", a, perl=TRUE)

【讨论】:

  • 仅代码答案可能会解决原始问题,但对解决方案的一些解释可以得到更好的答案。它可以帮助其他人了解如何在类似情况下使用您的解决方案。
  • @NigelRen 我添加了一些解释。好点了吗?
【解决方案4】:
a <- c("HELLO XO","DO HELLO","TWO XO","HO")

aa <- gsub("O","",a)
gsub("HELL", "HELLO",aa)

【讨论】:

  • 这不是 OP 正在寻找的。这将删除 O,并恢复 HELLO,但它也会将原始输入 i 中的所有 HELL 转换为 HELLO。
【解决方案5】:

有点冗长,但你可以这样尝试

a <- c("HELLO XO","DO HELLO","TWO XO","HO")
b <- lapply(a, function(x) unlist(strsplit(x, " ")))
b
> b
[[1]]
[1] "HELLO" "XO"   

[[2]]
[1] "DO"    "HELLO"

[[3]]
[1] "TWO" "XO" 

[[4]]
[1] "HO"


c <- unlist(lapply(b, function(y) paste(ifelse( y == "HELLO", "HELLO", gsub("O", "", y)), collapse = " " )))
c

[1] "HELLO X" "D HELLO" "TW X"    "H"  

【讨论】:

  • 步骤 b 是 -> 用空格分割每个字符串。步骤 c --> 对于每个拆分词,检查它是否是 hello。最后再次绑定分割字符串。
  • 你相信这种方法吗?
猜你喜欢
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多