5

複数のテキストがあり、それぞれが 1 つまたは複数の Web リンクへの参照で構成されている可能性があります。例えば:

 text1= "s@1212a as www.abcd.com asasa11". 

抽出方法:

   "www.abcd.com" 

Rのこのテキストから?言い換えれば、で始まり、wwwで終わるパターンを抽出しようとしています.com

4

3 に答える 3

11

regmatchesこのアプローチではregexpr/grepgexprと を使用しregmatchesます。テスト データを拡張して、より多くの例を含めました。

text1 <- c("s@1212a 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、文字列に複数の一致が存在する可能性があることを意味するように使用したためです。一致するものが多くても 1 つしかないことがわかっている場合は、regexpr代わりに使用できます

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

ただし、これはすべての結果をベクトルとして返し、各文字列から 1 つの結果のみを返すことに注意してください (www.cats.com は結果に含まれないことに注意してください)。gsubただし、結果が見つからない場合、その方法は入力全体を返すため、全体として、これら2つの方法のいずれかが方法よりも好ましいと思います。たとえば、見てみましょう:

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

そしてそれは、パターンをもう少し堅牢になるように変更した後でも同じです。明らかにパターンに一致しないにもかかわらず、結果に「asdf」が表示されます。

恥知らずでばかげた自己宣伝: regmatchesR 2.14 で導入されたので、以前のバージョンの R で立ち往生している場合は、うまくいかない可能性があります。私のgithubリポジトリからfuture2.14パッケージをインストールできない限り、2.14で導入された機能のサポートをRの以前のバージョンに提供します.

ストラップ。上記の ## と同じ結果が得られる別の方法は次のとおりです。

library(gsubfn)
strapplyc(test1, pattern)

正規表現 正規表現を解読する方法について説明します。

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

説明:

wwwwwwの部分にマッチ

\\.\\プレーン.は正規表現で「任意の文字」を表すため、実際の「ドット」文字をエスケープする必要があります。

.*?.任意の文字を表し、*は 0 回以上一致するように指示し、?次の*は貪欲にならないように指示します。そうしないと、"asdf www.cats.com www.dogs.com asdf" は "www.cats.com www.dogs.com" に 2 つの一致があることを認識せずに、すべての "www.cats.com www.dogs.com" と一致します。

\\.もう一度、実際のドット文字をエスケープする必要があります

comこの部分は、一致させたい末尾の「com」と一致します

すべてをまとめると、次のように書かれています: www から始めてください。次に、最初の「.com」に到達するまで、任意の文字に一致します

于 2013-03-22T22:20:33.423 に答える
7

gsub関数を確認してください。

x = "s@1212a as www.abcd.com asasa11"
gsub(x=x, pattern=".*(www.*com).*", replace="\\1")

基本的な考え方は、保持したいtxtを括弧で囲み、行全体をそれで置き換えることです。gsub "\\ 1"の置換パラメーターは、括弧内で見つかったものを参照します。

于 2013-03-22T20:23:52.670 に答える
2

ここでのソリューションは素晴らしく、基本的です。迅速な解決策が必要な場合は、 を使用できqdapますgenXtract。この関数は基本的に左右の要素を取り、その間のすべてを抽出します。設定with = TRUEすると、次の要素が含まれます。

text1 <- c("s@1212a 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関数のコードを見ると、Dasonのソリューションのラッパーです。

于 2013-03-23T00:13:14.393 に答える