如何对特殊字符进行负面观察

时间:2017-10-20 10:18:35

标签: r regex

我想

  1. 排除任何包含No或no的句子,除非No后面跟冒号或问号
  2. 然后我想摆脱任何包含问号或冒号后跟N或否或否的句子。
  3. 输入文字:

    N-Acetyl-cysteine used Yes or no?No.
    Acetic acid used Yes or no?Y.
    NBI used Yes or no? Y.
    Diaphragmatic pinch:40cm
    : Y -33cm.
    Inlet patch - Yes or No: N.
    No loss of stain.
    

    所需的输出

    Acetic acid used Yes or no?Y.
    NBI used Yes or no? Y.
    Diaphragmatic pinch:40cm
    : Y -33cm.
    

    目前在r中的尝试:

    gsub(".*[Nn][Oo](?![:]|[?]).*?(\\.|\n|:|$)", "", x[, y], perl = T)
    

    结果:

        N-Acetyl-cysteine used Yes or no?No.
        Acetic acid used Yes or no?Y.
        NBI used Yes or no? Y.
        Diaphragmatic pinch:40cm
        : Y -33cm.
        Inlet patch - Yes or No: N.
    

    然后

    gsub(".*[Nn][Oo](:|\\?)(\\s*).*?(\\.|\n|:|$)", "", x[, y])
    

    结果:

    Diaphragmatic pinch:40cm
    : Y -33cm.
    

    第一个gsub工作正常,但第二个没有消除太多。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您的第二个要求应该包括冒号或问号与N之间的可选空格。

正则表达式必须看起来像

.*(?:no(?![?:])|[?:]\s*N).*\R*

请参阅regex demo

<强>详情

  • .* - 除了换行符之外的任何0 +字符
  • (?:no(?![?:])|[?:]\s*N) - 与两种选择中的任何一种匹配的非捕获交替组:
    • no(?![?:]) - no未跟?:
    • | - 或
    • [?:]\s*N - ?:,0 +个空格,N
  • .* - 其余部分
  • \R* - 任何0 +换行符序列。

perl=TRUE参数使R使用PCRE正则表达式引擎解析模式,ignore.case=TRUE参数使模式不区分大小写。

以下是fixed R code

x <- "N-Acetyl-cysteine used Yes or no?No.
Acetic acid used Yes or no?Y.
NBI used Yes or no? Y.
Diaphragmatic pinch:40cm
: Y -33cm.
Inlet patch - Yes or No: N.
No loss of stain."
cat(gsub(".*(?:no(?![?:])|[?:]\\s*N).*\\R*", "", x, perl=TRUE, ignore.case=TRUE), sep="\n")

输出:

Acetic acid used Yes or no?Y.
NBI used Yes or no? Y.
Diaphragmatic pinch:40cm
: Y -33cm.