我试图在R中使用正则表达式来查找长句子(我将称之为x)的向量内的一个或多个短语。R中的正则表达式中的联合
因此,举例来说,这个工作得很好一句话:
grep("(phrase 1)",x)
但是,这并不为两个(或更多)的词组:
grep("(phrase 1)+(phrase 2)+",x)
正如我所期望的。当我读到它时,最后一个应该给我一个或多个短语1的所有匹配,和 1个或更多的短语2。但它什么都没有返回。
我试图在R中使用正则表达式来查找长句子(我将称之为x)的向量内的一个或多个短语。R中的正则表达式中的联合
因此,举例来说,这个工作得很好一句话:
grep("(phrase 1)",x)
但是,这并不为两个(或更多)的词组:
grep("(phrase 1)+(phrase 2)+",x)
正如我所期望的。当我读到它时,最后一个应该给我一个或多个短语1的所有匹配,和 1个或更多的短语2。但它什么都没有返回。
你必须告诉它跳过中间的任何字符:
grep("(phrase 1)+.*(phrase 2)+",x)
另外请注意,它不会颠倒顺序,所以你可能需要添加明确。总的来说,单独搜索每个短语可能会更简单(特别是如果有两个以上的短语),然后结合intersect
和union
来获得整体结果。
完整的例子(例如,你知道,数据...)总是好的。
R中正则表达式的主键是记住有三个(!!)不同的引擎。我倾向于喜欢Perl的正则表达式。
接下来,重要的是要记住,有元字符 - 所以如果你想要parens,你需要逃避它们。
就这样,这里有一个例子:
> txt <- c("The grey fox jumped", "The blue cat slept", "The sky was falling")
> grep("blue", txt) # finds sentence two
[1] 2
> grep("(grey|blue)", txt, perl=TRUE) # finds one and two
[1] 1 2
> grep("(red|blue)", txt, perl=TRUE) # finds only two (as it should)
[1] 2
>
所以用Perl的正则表达式,你列出括号内的替代品,由管道符号分隔。
明白了,但是我想要的是“灰色和蓝色”(在你的例子中它不会匹配)。或者“(灰色)AND(跳跃)”,它可以匹配句子1.我想用它来隔离词组。 – bshor 2010-07-02 20:38:36
啊 - 这个解释更清楚了,Aniko告诉你如何在中间加入“绒毛”。 – 2010-07-02 20:45:21
另一种方式
which(grepl("(phrase 1)+",x) & grepl("(phrase 2)+",x))
有一种方法使用向前看符号单一的正则表达式来做到这一点,但大多数正则表达式引擎将非常缓慢执行:
> txt <- c("The grey fox jumped", "The blue cat slept", "The fox is grey", "The cat is grey")
> grep("(?=.*fox)(?=.*grey)", txt, perl=TRUE)
[1] 1 3
只是为了澄清:你想需要找到_both_短语或_either_ one就足够了? – Aniko 2010-07-02 20:25:47
这两个短语,但以任何顺序。它可以是两个或更多的短语。 – bshor 2010-07-02 21:05:18