R

时间:2018-06-28 16:17:13

标签: r regex grep regex-lookarounds grepl

假设我有一组字符串:

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”。诚然,我不清楚括号在正则表达式中是如何工作的,甚至在这种情况下“分组”的含义还不清楚。我很难找到与如何对正则表达式的不同部分进行分组,要求和“可选化”相关的问题,以便我可以将短语 开头为可选字符并以否定的回溯开头 。编写这样的表达式的正确方法是什么?

3 个答案:

答案 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