Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中向前看以按顺序识别单词的模式_R_Regex_Pcre - Fatal编程技术网

在R中向前看以按顺序识别单词的模式

在R中向前看以按顺序识别单词的模式,r,regex,pcre,R,Regex,Pcre,我正在尝试解析一组字符串。 我需要找出样本中是否检测到“bcl-2”。 例如:“在45%的患者中检测到bl-2”。 但是,存在一些具有挑战性的可能变化: 1.“在45%的患者中检测到bcl-2,bcl-6未检测到” 2.“bcl-2在45%的人群中检测到bcl-6, 3.“no在45%的患者中检测到bcl-2和bcl-6的证据” 因此,我试图定义正则表达式代码,它将: 1.“bcl-2”的前瞻性 2.然后,从该点向前看“检测到的” 3.然后在“bcl-2”和“检测到”之间查看后面的,确保没有“n

我正在尝试解析一组字符串。 我需要找出样本中是否检测到“bcl-2”。 例如:“在45%的患者中检测到bl-2”。 但是,存在一些具有挑战性的可能变化:

1.“在45%的患者中检测到bcl-2,bcl-6未检测到”
2.“bcl-2在45%的人群中检测到bcl-6,
3.“no在45%的患者中检测到bcl-2和bcl-6的证据”

因此,我试图定义正则表达式代码,它将:

1.“bcl-2”的前瞻性
2.然后,从该点向前看“检测到的”
3.然后在“bcl-2”和“检测到”之间查看后面的,确保没有“not”。
4.如果可能,查看“bcl-2”后面的,确保“没有证据”(尽管我可以单独处理此情况)

我尝试了以下不起作用的代码。具体来说,它不会向后看,所以我猜我缺少的是向后看所固有的东西

此正则表达式适用于“未检测到bcl-2但未检测到bcl-2”,但不适用于“45%检测到bcl-6未检测到”

所以我认为这会起作用,但事实并非如此:

grepl("(?=bcl-?2)(?=.*detected)(?<!not)",y, ignore.case = T,perl=T)

grepl((?=bcl-2)(?=.*detected)(?Lookarounds是零宽度断言,这意味着模式匹配时正则表达式索引没有移动(匹配的字符没有添加到匹配值,连续的Lookarounds都从同一位置开始其模式检查)。因此,
(?=bcl-2)(?!.*没有)(?=.*detected)
匹配空位置(空字符串)然后是
bcl2
bcl-2
,在除换行符以外的任何0+字符之后没有
not
子字符串,在除换行符之外的任何0+字符之后检测到
。在输入字符串中的每个位置尝试此模式,因为没有锚。该模式n几乎不做你需要的事

以下是一个可能的解决方案:

\bbcl-2\b(?:(?!\bbcl-\d|\bnot\b).)*?\bdetected\b
见:

  • \b
    -单词边界
  • bcl-2
    -a
    bcl-2
    子串
  • \b
    -单词边界
  • (?:(?!\bbcl-\d |\bnot\b)。*?
    -(a)除换行符以外的任何0+(但尽可能少)字符,这些字符不启动以下两个序列:
    • \bbcl-\d
      -一个wor边界,后跟
      bcl-
      和一个数字
    • |
      -或
    • \bnot\b
      -一个完整的单词
      不是
  • \b检测\b
    -检测到一个完整的单词
见下文:

x[1]“在45%的患者中检测到bcl-2,但未检测到bcl-6”

您提到的唯一积极选项是一个包含字符串的选项,
“检测到bcl-2“
,为什么不直接搜索它呢?试试看。谢谢!效果很好!有没有其他方法可以改变字符串上的正则表达式位置,使其成为匹配的前瞻模式的结尾。我最初认为原子模式(?>字符串)或者前瞻模式末尾的\\Z符号应该有效。但它们没有。从您的响应中,我意识到它们可能都不会改变字符串上的位置。@user2387584我不明白您要求的是什么。当您使用消费模式时(不在lookarounds内),正则表达式索引会自动升级。这正是正则表达式引擎从左到右解析字符串的方式。您对检查任何字符向量中是否存在部分匹配感兴趣。对吗?如果没有,请举例说明。@Wiktor Stribiżew非常感谢您在这里以及其他许多问题上的帮助其他用户都问了!!!我希望我能回答100以上关于我的第二个问题,我在你对另一个用户的帖子的评论中找到了一个答案:你的“消极前瞻有问题”,因为它不是前瞻,它是一个不能有未知长度模式的前瞻。看起来你可以这样使用前瞻-
“^(?。**).*”
例如,要查找不在“dog”前面的“cat”,请使用
“^(?。********)。*cat”
。请注意^指示从字符串开始搜索。@Wiktor Stribiżew-您知道为什么这个代码
grepl((?=*?重新排列|。*?易位|。*?融合|..\\S[;]\\S)(bcl 2 | 14[:]18)(?:(透露)发现)看(n)看(n)看(n)看(n)看(n)检测(d)发现(d)演示(d)年,y,y,perl=TRUE,perl=TRUE,忽略。bnot\\bnot\\bnot\\bnot\\b。b)not\\b。b)not。b)not。b)不可。b)的,b)不可能,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可,不可|,))*?(显示(ed)|参见(n)|检测(ed)|演示(d)|”)被评估为正确,但一起被评估为错误
\bbcl-2\b(?:(?!\bbcl-\d|\bnot\b).)*?\bdetected\b
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"