我希望保留所有以字符串中的特定字母(让我们说“ 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”结尾的事件。你有什么主意吗?
答案 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"
也许您可以匹配它们:
\b\da\b
\b
字边界\d
一个数字a
匹配一个\b
字边界请注意,在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 = " ")