假设我有一组字符串:
test <- c('MTB', 'NOT MTB', 'TB', 'NOT TB')
我要写一个正则表达式来严格匹配“ TB”或“ MTB”(例如,表达式“ M?TB”),如果该失败以短语“ NOT”开头(包括空格)。 / p>
因此,我的预期结果是
TRUE FALSE TRUE FALSE
到目前为止,我已经尝试了
的几种变体grepl("(?<!NOT )M?TB", test, perl = T)
TRUE TRUE TRUE FALSE
失败。如您所见,短语“ NOT MTB”符合我的正则表达式标准。
似乎包含可选字符“ M?”似乎让R认为背后的负面表情也是可选的。我一直在研究使用括号对模式进行分组,例如
grepl("(?<!NOT )(M?TB)")
TRUE TRUE TRUE FALSE
这也未能排除短语“ NOT MTB”。诚然,我不清楚括号在正则表达式中是如何工作的,甚至在这种情况下“分组”的含义还不清楚。我很难找到与如何对正则表达式的不同部分进行分组,要求和“可选化”相关的问题,以便我可以将短语 开头为可选字符并以否定的回溯开头 。编写这样的表达式的正确方法是什么?
答案 0 :(得分:2)
我们可以使用开始(^
)和结束($
)来匹配那些单词
grepl("^M?TB$", test)
#[1] TRUE FALSE TRUE FALSE
如果注释中提到了其他字符串,例如@WiktorStribiżew,那么一个选择就是
test1 <- c(test, "THIS MTB")
!grepl("\\bNOT M?TB\\b", test1) & grepl("\\bM?TB\\b", test1)
#[1] TRUE FALSE TRUE FALSE TRUE
答案 1 :(得分:2)
test = c("MTB", "NOT MTB", "TB", "NOT TB", "THIS TB", "THIS NOT TB")
grepl("\\b(?<!NOT\\s)M?TB\\b",test,perl = TRUE)
[1] TRUE FALSE TRUE FALSE TRUE FALSE
答案 2 :(得分:-1)
对于该问题的意图有一些疑问,但是这里有一些代码可以根据需要进行尝试。
添加:海报阐明了#2和#3与所寻找的相似。
1)可以不用以下正则表达式来完成:
test %in% c("TB", "MTB")
## [1] TRUE FALSE TRUE FALSE
2)如果问题不在于完全匹配,则将匹配项也返回到不匹配NOT M?TB的M?TB:
grepl("M?TB", test) & !grepl("NOT M?TB",test)
## [1] TRUE FALSE TRUE FALSE
3)另一种方法是用X代替NOT M?TB,然后在M?TB上使用grepl:
grepl("M?TB", sub("NOT M?TB", "X", test))
## [1] TRUE FALSE TRUE FALSE