【问题标题】:Match string, but only if not preceded by other string匹配字符串,但前提是前面没有其他字符串
【发布时间】:2014-07-31 10:52:15
【问题描述】:

假设我有字符串向量:

v = c("SPX.Close", "AAPL.Low", "Lo", "LowPrice", "PriceLow", "low")

如何编写匹配所有类似于短语“low”的字符串的正则表达式?

grep("lo", v, ignore.case=T) # 1 2 3 4 5 6 7

这也匹配第一个字符串,这是我不想要的。

如何匹配lo 只有在前面没有字母c

【问题讨论】:

    标签: r regex


    【解决方案1】:

    负后视(R 中的 PCRE)

    R 使用 PCRE 引擎,它支持lookbehind。这样做:

    grep("(?<!c)lo", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
    

    (?&lt;!c) 的否定后视断言当前位置之前的不是c

    选项 2:检查大写字母,打开不区分大小写的内联

    根据您的意见,更通用的选择是断言 lo 前面没有大写字母:

    grep("(?<![A-Z])(?i)lo", subject, perl=TRUE, value=TRUE);
    

    对于这个选项,我们使用内联修饰符 (?i) 来启用不区分大小写,但前提是我们检查了我们的位置之前没有大写字母。

    参考

    【讨论】:

    • 谢谢,我已经编辑了我的问题以在数据中包含“低”字符串并且仍然匹配它(即ignore.case=T)。基于您的其余答案,grep("(?&lt;!c)lo", v, ignore.case=T, perl = T) 似乎对我有用。您能否进一步解释正则表达式语法中涉及的各种符号?
    • 仅供参考,添加了第二个选项,我们检查 lo 前面没有大写字母(更通用)
    • 这是否可能不使用负面观察?我正在使用的软件不支持负面的看法。
    【解决方案2】:

    您可以使用否定的lookbehind:

    grep("(?<!C)lo", v, ignore.case=T, perl=T) 
    

    这将确保字符串前面没有 C。

    【讨论】:

    • 谢谢,我觉得perl = T这个参数是必须的,否则会报错。
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多