2011-06-01 183 views
14

我找回來回來R.樂使用正則表達式引用的一個優雅的方式我解釋一下:如何在R中使用帶`grep`的反向引用?

比方說,我想找到用了一個月名開頭的字符串:

x <- c("May, 1, 2011", "30 June 2011") 
grep("May|^June", x, value=TRUE) 
[1] "May, 1, 2011" 

該作品,但我真的想月份(即「五一」,而不是整個匹配的字符串隔離

因此,人們可以使用gsub返回使用substitute參數後面引用但是,這裏有兩個問題:。

  1. 您必須將模式包裝在「。*(pattern)。*)」中,以便替換髮生在整個字符串上。
  2. gsub不是返回非匹配字符串的NA,而是返回原始字符串。這顯然不是我的願望:

的代碼和結果:

gsub(".*(^May|^June).*", "\\1", x) 
[1] "May"   "30 June 2011" 

我大概可以做各種額外檢查編寫一個解決方法,但是這個方法很快就會非常混亂。

要一清二楚,所期望的結果應該是:

[1] "May"   NA 

是否有實現這一目標的一個簡單的方法?

回答

8

stringr封裝具有功能正是爲了這個目的:

library(stringr) 
x <- c("May, 1, 2011", "30 June 2011", "June 2012") 
str_extract(x, "May|^June") 
# [1] "May" NA  "June" 

這是一個相當簡單包裝的regexpr,但stringr通常會使字符串處理更容易比基礎R功能更加一致。

+1

謝謝,哈德利。一般來說,我是絃樂器的忠實粉絲。我不知道爲什麼我沒有想到首先在那裏搜索。 D'哦。 – Andrie 2011-06-01 17:12:10

20

regexpr類似於grep,但返回的(第一)匹配的每個串的位置和長度:

> x <- c("May, 1, 2011", "30 June 2011", "June 2012") 
> m <- regexpr("May|^June", x) 
> m 
[1] 1 -1 1 
attr(,"match.length") 
[1] 3 -1 4 

這意味着,所述第一串有一個匹配長度3在位置1盯着,第二個字符串沒有匹配,第三串在位置1

要提取的比賽進行了比賽長度爲4,你可以使用類似:

> m[m < 0] = NA 
> substr(x, m, m + attr(m, "match.length") - 1) 
[1] "May" NA  "June" 
+0

很好的建議,謝謝。最後,我決定接受哈德利的回答,僅僅因爲它更優雅。 – Andrie 2011-06-01 17:14:33

+0

@NPE很高興看到它如何完成與基地R – mcheema 2013-09-26 20:10:36

3

gsubfn軟件包比grep和regexpr函數更普遍,並且有一些方法可以讓您返回後退,請參閱strapply函數。

+1

試試這個:'library(gsubfn); strapply(x,「^(May | June)」)'。 – 2011-06-01 17:09:15