我正试图解析一组字符串。我需要找出样品中是否检测到'bcl-2‘。例如:“在45%的患者中检测到bl-2”。然而,有一些可能的变化是具有挑战性的:
1. 45%的bcl-6是而非检测到bcl-2。
因此,我试图定义regex代码,以便:
我尝试了下面的代码,但不起作用。具体来说,它不回头看,所以我猜想,有一些内在的东西,我错过了。
该判据适用于"bcl-2未检测到bcl-2“,而"bcl-2在45% bcl-6未检测到bcl-6未检测到”则未检测到bcl-2。
y="bcl-2 was detected in 45% bcl-6 was not detected"
grepl("(?=bcl-?2)(?!.*not)(?=.*detected)",y, ignore.case = T,perl=T) 所以我以为这会成功,但却没有:
grepl("(?=bcl-?2)(?=.*detected)(?<!not)",y, ignore.case = T,perl=T)我正在努力理解背后的逻辑。关于最后一行代码->,我认为(?=bcl-?2)期待到字符串中以'bcl-2‘开头的点。然后,我认为(?=.*detected)期待到字符串中“检测到”开始的位置。然后,我想回头看,从那个位置开始寻找‘不’。这当然是错误的..。那么我错过了什么关于查找逻辑
顺便说一句,我一直在使用一个伟大的网站,试图找出这个https://www.regular-expressions.info/recurse.html。
发布于 2017-10-07 17:56:13
查找是零宽度断言,这意味着当模式匹配时regex索引没有移动(匹配的字符没有添加到匹配值中,并且连续的查找都从相同的位置开始它们的模式检查)。因此,(?=bcl-?2)(?!.*not)(?=.*detected)匹配一个空位置(空字符串),该位置后面跟着是bcl2或bcl-2,在除行中断字符之外的任何0+字符之后没有not子字符串,在除行中断字符之外的任何0+字符之后都是detected。此模式在输入字符串中的每个位置尝试,因为没有锚点。这种模式很难满足你的需要。
以下是一个可能的解决方案:
\bbcl-2\b(?:(?!\bbcl-\d|\bnot\b).)*?\bdetected\b\b -一个单词边界bcl-2 -一个bcl-2子字符串\b -一个单词边界(?:(?!\bbcl-\d|\bnot\b).)*? - (a 脾气暴躁的象征)除行中断字符以外的任何0+ (但尽可能少)字符,这些字符不会启动以下两个序列:\bbcl-\d - wor边界,后面跟着bcl-和一个数字| -或\bnot\b -一个完整的词not
\bdetected\b -一个完整的词detected请参见下面的R演示:
x <- c("bcl-2 was detected in 45% bcl-6 was not detected",
"bcl-2 was not detected bcl-6 was detected in 45%",
"no evidendce of bcl-2 bcl-6 was detected in 45%")
grep("\\bbcl-2\\b(?:(?!\\bbcl-\\d|\\bnot\\b).)*?\\bdetected\\b", x, perl=TRUE, value=TRUE)
## => [1] "bcl-2 was detected in 45% bcl-6 was not detected"https://stackoverflow.com/questions/46622881
复制相似问题