2013-03-22 112 views

回答

10

regmatches此方法使用regexpr/grepgexprregmatches。我擴展了測試數據以包含更多示例。

text1 <- c("[email protected] www.abcd.com www.cats.com", 
      "www.boo.com", 
      "asdf", 
      "blargwww.test.comasdf") 

# Regular expressions take some practice. 
# check out ?regex or the wikipedia page on regular expressions 
# for more info on creating them yourself. 
pattern <- "www\\..*?\\.com" 
# Get information about where the pattern matches text1 
m <- gregexpr(pattern, text1) 
# Extract the matches from text1 
regmatches(text1, m) 

其中給出

> regmatches(text1, m) ## 
[[1]] 
[1] "www.abcd.com" "www.cats.com" 

[[2]] 
[1] "www.boo.com" 

[[3]] 
character(0) 

[[4]] 
[1] "www.test.com" 

注意到它返回一個列表。如果我們想要一個矢量,你可以在結果上使用unlist。這是因爲我們使用了gregexpr這意味着我們的字符串中可能有多個匹配項。如果我們知道最多有一個比賽,我們可以使用regexpr代替

> m <- regexpr(pattern, text1) 
> regmatches(text1, m) 
[1] "www.abcd.com" "www.boo.com" "www.test.com" 

但請注意,這將返回所有結果作爲載體,只有從每個字符串返回一個結果(注意www.cats.com不在結果中)。總的來說,我認爲這兩種方法中的任何一種都優於gsub方法,因爲如果沒有找到結果,這種方式將返回整個輸入。例如,看看:

> gsub(text1, pattern=".*(www\\..*?\\.com).*", replace="\\1") 
[1] "www.abcd.com" "www.boo.com" "asdf"   "www.test.com" 

即使修改了模式後,它更加穩健。儘管結果顯然與模式不符,但我們仍然在結果中獲得'asdf'。

無恥愚蠢的自我推銷:regmatches與R 2.14一起推出,所以如果你堅持使用R的早期版本,你可能會運氣不好。除非你能夠安裝future2.14包from my github repo它提供了2.14介紹早期版本的R.

strapplyc功能的一些支持。以上可以得到相同的結果作爲##的替代方案是:

library(gsubfn) 
strapplyc(test1, pattern) 

正則表達式下面是對如何破譯的正則表達式的一些說明:

pattern <- "www\\..*?\\.com" 

說明:

www匹配www部分

\\.我們需要e使用\\來看一個實際的'點'字符,因爲普通表達式中的普通.表示「任何字符」。

.*?.表示任何字符,則*告訴匹配0次或更多次,並且?以下的*告訴它不貪心。否則,「asdf www.cats.com www.dogs.com asdf」將作爲單一比賽匹配所有「www.cats.com www.dogs.com」,而不是承認在那裏有兩場比賽。

\\.我們再次需要逃避的實際點陣字符

com這部分的結束「COM」,我們要匹配

比賽全部放在一起,它說:開始以www。然後匹配任何字符,直到您到達第一個「.com」。

+0

還要注意,它確實會從blargwww.test.comasdf中提取www.test.com,它可能會可能並不理想,但對此案沒有任何意見,我決定允許。 – Dason 2013-03-22 22:22:31

+0

@ G.Grothendieck這也是一個不錯的方法 - 你爲什麼不把它作爲答案加入? – Dason 2013-03-22 22:55:52

+1

我已將它添加到您的答案。 – 2013-03-22 23:00:22

5

退房結束GSUB功能:

x = "[email protected] as www.abcd.com asasa11" 
gsub(x=x, pattern=".*(www.*com).*", replace="\\1") 

的基本思路是圍繞你想在括號保留TXT,然後用它替換整個行。 gsub「\\ 1」的替換參數指的是括號中的內容。

+0

工作,非常感謝你 – user1848018 2013-03-22 20:35:44

+0

我不認爲這一個是好的。例如,這將提取像* wwwabcdcom *這樣的詞,並將提取。 – agstudy 2013-03-22 20:42:27

+0

gsub(x = x,pattern =「。*(www \\ .. * \\ .com)。*」,「\\ 1」)將確保www和com之前的點存在,但它更難跟隨不熟悉正則表達式的人。 – kith 2013-03-22 20:48:26

2

這裏的解決方案非常棒,並且基於此。對於那些想要快速解決的問題,您可以使用qdapgenXtract。這個函數基本上需要一個左元素和一個右元素,它將提取之間的所有內容。通過設置with = TRUE將包括這些元素:

text1 <- c("[email protected] www.abcd.com www.cats.com", 
    "www.boo.com", 
    "asdf", 
    "http://www.talkstats.com/ and http://stackoverflow.com/", 
    "blargwww.test.comasdf") 

library(qdap) 
genXtract(text1, "www.", ".com", with=TRUE) 

## > genXtract(text1, "www.", ".com", with=TRUE) 
## $`www. : .com1` 
## [1] "www.abcd.com" "www.cats.com" 
## 
## $`www. : .com2` 
## [1] "www.boo.com" 
## 
## $`www. : .com3` 
## character(0) 
## 
## $`www. : .com4` 
## [1] "www.talkstats.com" 
## 
## $`www. : .com5` 
## [1] "www.test.com" 

PS如果你看一下功能代碼它是達誠公司的解決方案的包裝。