如何仅保留以特定字母结尾的事件?

时间:2019-06-02 12:21:28

标签: r regex string stringr

我希望保留所有以字符串中的特定字母(让我们说“ a”)结尾的事件。我不是在处理由不同元素组成的向量,而是要处理由空格分隔的字符串。

以下是数据:

 have="5a 4a 8a 10a 3a 5m 10m 7a 8p 11s 5s 4h 24h"
 want="5a 4a 8a 10a 3a 7a"

以下是一些代码:

gsub("([A-Z]|[0-9])([m|p|h|s])","", have)
gsub("\\w+m|p|h|s *", "", have)

应用这些gsub代码之一后,我得到两种类型的信息(字母数字后跟“ a”和纯数字)。

但是我仍然需要清理,因此我只得到以“ a”结尾的事件。你有什么主意吗?

4 个答案:

答案 0 :(得分:3)

您可以这样做:

  trimws(gsub("([A-Z]|[0-9]{1,})([b-z])","",have))
[1] "5a 4a 8a 10a 3a   7a"

要删除多余的空间,请执行以下操作:

gsub("\\s{2,}"," ",
      trimws(gsub("([A-Z]|[0-9]{1,})([b-z])","",have)))
#[1] "5a 4a 8a 10a 3a 7a"

答案 1 :(得分:2)

您可以使用此模式并替换为空字符串:

[ ]?[a-z0-9]+[mphs]
  • [ ]?可选空格(方括号仅是为了清楚起见)
  • [a-z0-9]+字符类,匹配1+次,a-z 0-9
  • [mphs]字符类,匹配m,p h或s

例如

have="5a 4a 8a 10a 3a 5m 10m 7a 8p 11s 5s 4h 24h"
gsub(" ?[a-z0-9]+[mphs]","", have)

结果

[1] "5a 4a 8a 10a 3a 7a"

Regex demo | R demo

也许您可以匹配它们:

\b\da\b
  • \b字边界
  • \d一个数字
  • a匹配一个
  • \b字边界

Regex demo

请注意,在character class [m|p|h|s]中,|并不意味着or,而是一个|字符,也可以写成[mphs|]

答案 2 :(得分:2)

您可以将其拆分为单词,使用grep识别以a结尾的单词,然后将它们粘贴回去。

Words = strsplit(have, "\\W+")[[1]]
paste(grep("a$", Words, value=T), collapse=" ")
[1] "5a 4a 8a 10a 3a 7a"

答案 3 :(得分:2)

或者更长或更简单的正则表达式,将其转换为向量,然后将其转换回字符串。

have_string <- "5a 4a 8a 10a 3a 5m 10m 7a 8p 11s 5s 4h 24h"
have_vector <- unlist(strsplit(have_string," "))
library(stringr)
want_vector <- have_vector[str_detect(have_vector, ".*?a$")]
want_string <- paste(want_vector, sep = " ", collapse = " ")