我想使用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
你能告诉我吗?答案 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。