正则表达式可选字符,前面是 R 中的负回溯



假设我有一组字符串:

test <- c('MTB', 'NOT MTB', 'TB', 'NOT TB')

我想编写一个正则表达式来严格匹配"TB"或"MTB"(例如,表达式"M?TB"(,当它前面没有短语"NOT"(包括空格(时。

因此,我的预期结果是

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

这也未能排除短语"不是山地车"。 诚然,我不清楚括号在正则表达式中的工作原理,或者在这种情况下"分组"的含义。 我很难找到与如何分组、要求和"可选"正则表达式的不同部分相关的问题,以便我可以匹配以可选字符开头并在前面进行负面回溯的短语。 编写这样的表达式的正确方法是什么?

我们可以使用开始(^(和结束($(来匹配这些单词

grepl("^M?TB$", test)
#[1]  TRUE FALSE  TRUE FALSE

如果还有其他字符串@Wiktor Stribiżew 在评论中提到,那么一种选择是

test1 <- c(test, "THIS MTB")
!grepl("\bNOT M?TB\b", test1) & grepl("\bM?TB\b", test1)
#[1]  TRUE FALSE  TRUE FALSE  TRUE
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和#3是沿着寻找的路线。

1(这可以在没有正则表达式的情况下完成,如下所示:

test %in% c("TB", "MTB")
## [1]  TRUE FALSE  TRUE FALSE

2(如果问题不是关于完全匹配,则将匹配项返回到 M?TB,该匹配项也不匹配 NOT M?TB:

grepl("M?TB", test) & !grepl("NOT M?TB",test)
## [1]  TRUE FALSE  TRUE FALSE

3(另一种选择是用X替换NOT M?TB,然后在M?TB上替换greple:

grepl("M?TB", sub("NOT M?TB", "X", test))
## [1]  TRUE FALSE  TRUE FALSE

最新更新