【发布时间】:2018-06-28 16:17:12
【问题描述】:
假设我有一组字符串:
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
这也未能排除短语“NOT MTB”。诚然,我不清楚括号在正则表达式中是如何工作的,甚至不清楚“分组”在这种情况下的含义。我很难找到与如何对正则表达式的不同部分进行分组、要求和“可选”相关的问题,以便我可以匹配一个短语以可选字符开头并以否定回溯开头 em>。写这样的表达式的正确方法是什么?
【问题讨论】:
-
为什么不简单地使用
^MTB|TB' for regex?`表示要匹配的单个字符。这不会匹配NOT MTB我也相信。 -
请澄清 2 件事:1) 你能拥有你想要获得的
THIS MTB值吗? 2)如果NOT和TB之间有两个或多个空格,需要处理吗? -
我希望我的例子没有分散注意力。问题是编写一个匹配“M?TB”的正则表达式和负回溯的附加标准“(?
标签: r regex regex-lookarounds grepl