【发布时间】: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?
【问题讨论】:
假设我有字符串向量:
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 使用 PCRE 引擎,它支持lookbehind。这样做:
grep("(?<!c)lo", subject, perl=TRUE, value=TRUE, ignore.case=TRUE);
(?<!c) 的否定后视断言当前位置之前的不是c
选项 2:检查大写字母,打开不区分大小写的内联
根据您的意见,更通用的选择是断言 lo 前面没有大写字母:
grep("(?<![A-Z])(?i)lo", subject, perl=TRUE, value=TRUE);
对于这个选项,我们使用内联修饰符 (?i) 来启用不区分大小写,但前提是我们检查了我们的位置之前没有大写字母。
参考
【讨论】:
ignore.case=T)。基于您的其余答案,grep("(?<!c)lo", v, ignore.case=T, perl = T) 似乎对我有用。您能否进一步解释正则表达式语法中涉及的各种符号?
lo 前面没有大写字母(更通用)
您可以使用否定的lookbehind:
grep("(?<!C)lo", v, ignore.case=T, perl=T)
这将确保字符串前面没有 C。
【讨论】:
perl = T这个参数是必须的,否则会报错。