r- grepl以任意顺序查找匹配的字符串

问题描述 投票:0回答:3

我有一个匹配的字符串。需要查找与多个字符串(全部/全部)和任意顺序匹配的文本:

Text1 : "I have no intention to make illegal parking along the road or cause obstruction."

Text2 : "I have no intention to make illegal parking along the road or cause damage."

mycode的:

    mynames=c("illegal parking" , "obstruction")
grepl(paste(mynames, collapse='|'), Text1, ignore.case=TRUE)

[当我通过Text1Text2时-我都得到TRUE-两者皆为;但是我需要TRUEText1FALSEText2。仅当两个字符串都存在时才应生成-并且可以在文本中以任何顺序排列。

r regex grepl
3个回答
1
投票

|在正则表达式中表示“或”。这就是为什么两个文本都为TRUE的原因。您必须测试"illegal parking"是否跟随在"obstruction"后面(中间有无东西),在正则表达式中是"illegal parking.*obstruction",或者是否有其他方式,所以"illegal parking.*obstruction|obstruction.*illegal parking"

grepl("illegal parking.*obstruction|obstruction.*illegal parking", Text1, ignore.case=TRUE)

0
投票

[Text3添加了不同顺序的单词。

Text3 <- "I have no intention to cause obstruction and make illegal parking"

我们可以使用

grepl("illegal parking.*obstruction|obstruction.*illegal parking", 
       c(Text1, Text2, Text3), ignore.case = TRUE)
#[1]  TRUE FALSE  TRUE

或者如果您在mynames中还有更多的单词,我们可以使用paste0创建模式

pat <- paste0(paste0(mynames, collapse = ".*"), "|", 
              paste0(rev(mynames), collapse = ".*"))
pat
#[1] "illegal parking.*obstruction|obstruction.*illegal parking"

然后使用grepl中的正则表达式>

grepl(pat, c(Text1, Text2, Text3), ignore.case = TRUE)
#[1]  TRUE FALSE  TRUE

0
投票

您可以测试str_locate_all()的长度以查看两者是否匹配。因为str_locate_all()返回起始和结束位置,所以您需要检查模式长度乘以2。这种方法意味着您不必担心模式的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.