2010-07-02 20 views
1

我试图在R中使用正则表达式来查找长句子(我将称之为x)的向量内的一个或多个短语。R中的正则表达式中的联合

因此,举例来说,这个工作得很好一句话:

grep("(phrase 1)",x) 

但是,这并不为两个(或更多)的词组:

grep("(phrase 1)+(phrase 2)+",x) 

正如我所期望的。当我读到它时,最后一个应该给我一个或多个短语1的所有匹配, 1个或更多的短语2。但它什么都没有返回。

+0

只是为了澄清:你想需要找到_both_短语或_either_ one就足够了? – Aniko 2010-07-02 20:25:47

+0

这两个短语,但以任何顺序。它可以是两个或更多的短语。 – bshor 2010-07-02 21:05:18

回答

1

你必须告诉它跳过中间的任何字符:

grep("(phrase 1)+.*(phrase 2)+",x) 

另外请注意,它不会颠倒顺序,所以你可能需要添加明确。总的来说,单独搜索每个短语可能会更简单(特别是如果有两个以上的短语),然后结合intersectunion来获得整体结果。

+0

这个工程!我发现你想跳过中间的字符。但我确实想要相反的顺序匹配。 – bshor 2010-07-02 20:41:21

+0

这是你的意思:sapply(phrase.list,function(x)grep(x,y)? – bshor 2010-07-02 20:48:28

+0

后跟一个列表的交集,在这里找到:http://finzi.psych.upenn.edu/R/Rhelp02 /archive/98525.html – bshor 2010-07-02 21:21:46

0

完整的例子(例如,你知道,数据...)总是好的。

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的正则表达式,你列出括号内的替代品,由管道符号分隔。

+0

明白了,但是我想要的是“灰色和蓝色”(在你的例子中它不会匹配)。或者“(灰色)AND(跳跃)”,它可以匹配句子1.我想用它来隔离词组。 – bshor 2010-07-02 20:38:36

+0

啊 - 这个解释更清楚了,Aniko告诉你如何在中间加入“绒毛”。 – 2010-07-02 20:45:21

2

另一种方式

which(grepl("(phrase 1)+",x) & grepl("(phrase 2)+",x)) 
0

有一种方法使用向前看符号单一的正则表达式来做到这一点,但大多数正则表达式引擎将非常缓慢执行:

> 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