我有一个匹配的字符串。需要查找与多个字符串(全部/全部)和任意顺序匹配的文本:
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)
[当我通过Text1
和Text2
时-我都得到TRUE
-两者皆为;但是我需要TRUE
的Text1
和FALSE
的Text2
。仅当两个字符串都存在时才应生成-并且可以在文本中以任何顺序排列。
|
在正则表达式中表示“或”。这就是为什么两个文本都为TRUE的原因。您必须测试"illegal parking"
是否跟随在"obstruction"
后面(中间有无东西),在正则表达式中是"illegal parking.*obstruction"
,或者是否有其他方式,所以"illegal parking.*obstruction|obstruction.*illegal parking"
grepl("illegal parking.*obstruction|obstruction.*illegal parking", Text1, ignore.case=TRUE)
[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
您可以测试str_locate_all()
的长度以查看两者是否匹配。因为str_locate_all()
返回起始和结束位置,所以您需要检查模式长度乘以2。这种方法意味着您不必担心模式的顺序。