我有多個文本,每個文本可能包含對一個或多個網絡鏈接的引用。例如:從R中的文本中提取網站鏈接
text1= "[email protected] as www.abcd.com asasa11".
我如何提取:
"www.abcd.com"
從這段文字中的R?換句話說,我希望提取與www
啓動模式,並與.com
我有多個文本,每個文本可能包含對一個或多個網絡鏈接的引用。例如:從R中的文本中提取網站鏈接
text1= "[email protected] as www.abcd.com asasa11".
我如何提取:
"www.abcd.com"
從這段文字中的R?換句話說,我希望提取與www
啓動模式,並與.com
regmatches此方法使用regexpr
/grepgexpr
和regmatches
。我擴展了測試數據以包含更多示例。
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」。
退房結束GSUB功能:
x = "[email protected] as www.abcd.com asasa11"
gsub(x=x, pattern=".*(www.*com).*", replace="\\1")
的基本思路是圍繞你想在括號保留TXT,然後用它替換整個行。 gsub「\\ 1」的替換參數指的是括號中的內容。
工作,非常感謝你 – user1848018 2013-03-22 20:35:44
我不認爲這一個是好的。例如,這將提取像* wwwabcdcom *這樣的詞,並將提取。 – agstudy 2013-03-22 20:42:27
gsub(x = x,pattern =「。*(www \\ .. * \\ .com)。*」,「\\ 1」)將確保www和com之前的點存在,但它更難跟隨不熟悉正則表達式的人。 – kith 2013-03-22 20:48:26
這裏的解決方案非常棒,並且基於此。對於那些想要快速解決的問題,您可以使用qdap
的genXtract
。這個函數基本上需要一個左元素和一個右元素,它將提取之間的所有內容。通過設置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如果你看一下功能代碼它是達誠公司的解決方案的包裝。
還要注意,它確實會從blargwww.test.comasdf中提取www.test.com,它可能會可能並不理想,但對此案沒有任何意見,我決定允許。 – Dason 2013-03-22 22:22:31
@ G.Grothendieck這也是一個不錯的方法 - 你爲什麼不把它作爲答案加入? – Dason 2013-03-22 22:55:52
我已將它添加到您的答案。 – 2013-03-22 23:00:22