为了账号安全,请及时绑定邮箱和手机立即绑定

匹配多模式

匹配多模式

匹配多模式我想看看,如果"001"或"100"或"000"的4个字符的字符串中发生。0和1..例如,一个4个字符串可能类似于"1100"或"0010"或"1001"或"1111"..如何用一个命令来匹配字符串中的多个字符串?我知道grep可以用于模式匹配,但是使用grep,每次只能检查一个字符串。我想知道是否可以与其他命令或grep本身一起使用多个字符串。
查看完整描述

3 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

可以,停那儿吧。这个|在.grep模式的含义与or..这样,您就可以通过以下方法来测试您的模式:"001|100|000"作为你的模式。同时,grep是矢量化的,所以所有这些都可以一步完成:

x <- c("1100", "0010", "1001", "1111")pattern <- "001|100|000"grep(pattern, x)[1] 1 2 3

这将返回包含匹配模式的向量的索引(在本例中为前三个)。

有时,更方便的是有一个逻辑向量来告诉您向量中的哪些元素是匹配的。然后你可以用grepl:

grepl(pattern, x)[1]  TRUE  TRUE  TRUE FALSE

看见?regex以获得关于R中正则表达式的帮助。


编辑:为了避免手动创建模式,我们可以使用paste:

myValues <- c("001", "100", "000")pattern <- paste(myValues, collapse = "|")


查看完整回答
反对 回复 2019-07-20
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

以下是使用stringr包装

require(stringr)mylist = c("1100", "0010", "1001", "1111")str_locate(mylist, "000|001|100")


查看完整回答
反对 回复 2019-07-20
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

对不起,这是一个附加的回答,但这是太多的评论行。


我只想提醒你,可以通过paste(..., collapse = "|")作为一个单一的匹配模式使用是有限的-见下文。也许有人能知道极限在哪里?诚然,这一数字可能不现实,但根据要执行的任务,不应将其完全排除在我们的考虑之外。


对于非常多的项,需要一个循环来检查模式的每个项。


set.seed(0)

samplefun <- function(n, x, collapse){

  paste(sample(x, n, replace=TRUE), collapse=collapse)

}


words <- sapply(rpois(10000000, 8) + 1, samplefun, letters, '')

text <- sapply(rpois(1000, 5) + 1, samplefun, words, ' ')


#since execution takes a while, I have commented out the following lines


#result <- grepl(paste(words, collapse = "|"), text)


# Error in grepl(pattern, text) : 

#   invalid regular expression 

# 'wljtpgjqtnw|twiv|jphmer|mcemahvlsjxr|grehqfgldkgfu|

# ...


#result <- stringi::stri_detect_regex(text, paste(words, collapse = "|"))


# Error in stringi::stri_detect_regex(text, paste(words, collapse = "|")) : 

# Pattern exceeds limits on size or complexity. (U_REGEX_PATTERN_TOO_BIG)


查看完整回答
反对 回复 2019-07-20
  • 3 回答
  • 0 关注
  • 701 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信