2014-02-06 35 views
0

回顧後在str_extract有R

[01/29/14 16:42:55, 10.100.120.120, unknown]: spatial_monitor: Alan entered Conference Room (Zone Role contains Person role) 
[01/29/14 16:42:57, 10.100.120.120, unknown]: spatial_monitor: Alan left Conference Room (Zone Role contains Person role) 
[01/29/14 16:43:00, 10.100.120.120, unknown]: spatial_monitor: Kurt entered Conference Room (Computer desk contains Person role) 
[01/29/14 16:43:02, 10.100.120.120, unknown]: spatial_monitor: Kurt left Conference Room (Computer desk contains Person role) 
[01/29/14 16:43:03, 10.100.120.120, unknown]: spatial_monitor: Alan entered Conference Room (Zone Role contains Person role) 
[01/29/14 16:43:08, 10.100.120.120, unknown]: spatial_monitor: Alan left Conference Room (Zone Role contains Person role) 
[01/29/14 16:46:07, 10.100.120.120, unknown]: spatial_monitor: Fred entered Conference Room (Zone Role contains Person role) 
[01/29/14 16:46:08, 10.100.120.120, unknown]: spatial_monitor: Fred left Conference Room (Zone Role contains Person role) 

我想使用R中str_extract(庫stringr)提取的位置(「會議室」上面的例子中)的名稱下面的文本文件。邏輯是拉動字詞「進入」或「離開」後面的部分。爲此,我有以下的正則表達式

(?<=entered\s)[A-Z][a-z]+\s[A-Z][a-z]+ 

這在記事本++工作正常,但是當我嵌入此R中,我得到以下錯誤

> tt <- "[01/29/14 16:42:55, 10.100.120.120, unknown]: spatial_monitor: Alan entered Conference Room (Zone Role contains Person role)" 
> str_extract(tt, '(?<=entered\\s)[A-Z][a-z]+\\s[A-Z][a-z]+') 
Error in regexpr("(?<=entered\\s)[A-Z][a-z]+\\s[A-Z][a-z]+", "[01/29/14 16:42:55, 10.100.120.120, unknown]: spatial_monitor: Alan entered Conference Room (Zone Role contains Person role)", : 
    invalid regular expression '(?<=entered\s)[A-Z][a-z]+\s[A-Z][a-z]+', reason 'Invalid regexp' 

其他答案告訴我,lookahead and lookbehind only work with Perl。所以問題是如何使用str_extract來啓用Perl?或者有更好的方法來做到這一點?提前致謝。

+1

這個工作並沒有採用前瞻/回顧後。如圖所示,將要提取的部分括起來:'library(gsubfn); strapplyc(tt,'entered \\ s([A-Z] [a-z] + \\ s [A-Z] [a-z] +)',simplify = TRUE)' –

回答

1
library(stringr) 
tt <- "[01/29/14 16:42:55, 10.100.120.120, unknown]: spatial_monitor: Alan entered Conference Room (Zone Role contains Person role)" 
str_extract(tt, perl('(?<=entered\\s)[A-Z][a-z]+\\s[A-Z][a-z]+')) 
# [1] "Conference Room" 
+0

太棒了!感謝幫助。謝謝。 –

+0

@BalaDeshpande我的榮幸。 Simafore博客曾幫助我發現RapidMiner。 :) – lukeA

1

你的正則表達式有效。如果您指定perl = TRUE,它適用於sub。您也可以使用sub功能,爲您的任務:

sub('.*(?<=entered\\s)([A-Z][a-z]+\\s[A-Z][a-z]+).*', '\\1', tt, perl = TRUE) 
# [1] "Conference Room" 

另外,不perl

sub('.*entered\\s([A-Z][a-z]+\\s[A-Z][a-z]+).*', '\\1', tt) 
# [1] "Conference Room" 
+0

感謝您提供替代方案。我有upvoted。不過,我喜歡其他答案。 –