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

R 如何仅保留以特定字母结尾的事件?,r,regex,string,stringr,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”)结尾的所有事件。我不是在处理由不同元素组成的向量,而是一个字符串,其出现处由空格分隔

以下是数据:

 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”结尾的事件。你有什么想法吗?

你可以做:

  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"
你可以做:

  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"

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

[ ]?[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"
|

或许您可以将它们匹配起来:

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


请注意,在
[m | p | h | s]
中,
并不表示
,而是一个
字符,也可以写成
[mphs |]

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

[ ]?[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"
|

或许您可以将它们匹配起来:

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


请注意,在
[m | p | h | s]
中,
不是
而是
字符,也可以写成
[mphs |]

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

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

您可以将其拆分为单词,使用
grep
识别以a结尾的单词,然后将它们重新粘贴在一起

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

或者,更长但更简单的regexp,将其转换为向量,然后再转换回字符串

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 = " ")

使用_string或者,更长但更简单的regexp,将其转换为向量,然后再转换回字符串

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 = " ")

让\u字符串尝试此模式
\b\da\b
请参阅尝试此模式
\b\da\b
请参阅谢谢!我可以从哪种资源学习这样做?你到底是怎么得到“[a-z0-9]+[mphs]”的?@aguiot这是一个可以匹配1倍以上所列任何一个参数的a。字符类没有或
|
。您可以将其编写为
[mphs |]
,它还将匹配管道
。谢谢!我可以从哪种资源学习这样做?你到底是怎么得到“[a-z0-9]+[mphs]”的?@aguiot这是一个可以匹配1倍以上所列任何一个参数的a。字符类没有或
|
。您可以将其编写为
[mphs |]
,并且它还将匹配管道