使用AND运算符组合两个grep函数

时间:2018-03-10 01:10:50

标签: r regex grep

我想使用AND运算符组合以下命令:

grep("^ab", strings, value = TRUE)

grep("ab$", strings, value = TRUE)

以下是OR运算符的示例 http://r.789695.n4.nabble.com/grep-for-multiple-pattern-td4685244.html#a4685247

你能告诉我吗?

2 个答案:

答案 0 :(得分:3)

在正则表达式中搜索AND运算符(无论是在R还是其他地方)可能是一个漫长而悲伤的搜索。布尔值表示两个语句都必须为true。你会如何将其应用于正则表达式?考虑grep("ab", strings)中的正则表达式模式" ab"。即使这个简单的模式也有几个要求,所有这些都必须是真实的。它必须有一个" a",它必须有一个" b"和" b"必须遵循" a"直接

strings <- c("abraham, not ahab", "no it was ahab", 
             "abraham was the one they left on ceti alpha V", 
             "You're talking about Sherlock Holmes", "He tasks me", "ab")
grep("ab", strings, value = TRUE)
# [1] "abraham, not ahab"                            
# [2] "no it was ahab"                               
# [3] "abraham was the one they left on ceti alpha V"
# [4] "You're talking about Sherlock Holmes"         
# [5] "ab" 

如果你想要的是匹配两个开头的字符串&#34; ab&#34;并以&#34; ab&#34;结束,然后@ r2evans模式将适合您:grep("^ab.*ab$", strings, value = TRUE)将向您显示它们。这意味着它以&#34; ab&#34;开头,有零个或多个其他字符,然后以&#34; ab&#34;结束。

grep("^ab.*ab$", strings, value = TRUE)
# [1] "abraham, not ahab"
# NOTICE THAT THIS DOESN'T MATCH "ab", despite "ab" being at the beginning
# AND the end

如果你想要的是匹配所有以&#34; a&#34;开头的字符串。紧随其后的是&#34; b&#34;以及所有以&#34; a&#34;结尾的人。紧接着是&#34; b&#34;然后你真的想要grep("(^ab)|(ab$)", strings, value = TRUE)

grep("^ab|ab$", strings, value = TRUE)
# [1] "abraham, not ahab"                            
# [2] "no it was ahab"                               
# [3] "abraham was the one they left on ceti alpha V"
# [4] "ab"

那么孤独&#34; ab&#34;案件?什么样的正则表达式模式会与那个匹配?

grep("^ab$", strings, value = TRUE)
# [1] "ab"

在这种情况下,我们希望所有的比赛都以&#34; ab&#34;开始和结束,但它必须是相同的&#34; ab&#34;。当然,我们可以将其与其他&#34; AND&#34;版本,并获得ab在开始时的所有匹配,并且ab在最后:

grep("^ab$|^ab.*ab$", strings, value = TRUE)
# [1] "abraham, not ahab" "ab"   

..还有一件事: 我们可以使用@ r2evans评论来演示一种带有正则表达式的DeMorgan法则。请注意,具有|元字符的模式产生的结果与通过将单个正则表达式匹配与布尔值AND组合生成的逻辑向量对strings对象进行子集化的方式相同:

strings[grepl("^ab", strings) & grepl("ab$", strings)]
# [1] "abraham, not ahab" "ab"

这里grepl返回一个逻辑向量,我们使用它两次。对于匹配TRUE的{​​{1}}的每个元素,第一个是strings,对于匹配"^ab"的每个元素,第一个是"ab$"。将这些逻辑向量与&运算符组合产生与具有|元字符的模式相同的事物。

答案 1 :(得分:0)

您可以使用

grep("^ab(.*ab)?$", strings, value = TRUE)

模式匹配以ab开头的字符串,然后有一个以ab结尾的可选子字符串,然后字符串结尾应该跟随:

  • ^ - 字符串开头
  • ab - ab子字符串
  • (.*ab)? - 重复1次或0次(由于?量词)
    • .* - 任意0个字符,尽可能多
    • ab - ab子字符串
  • $ - 字符串结束。

请参阅regex demo