6

URL の文字ベクトルから始めます。目標は、会社の名前のみで終わることです。つまり、以下の例では、のみ"test"の列を意味します。"example""sample"

urls <- c("http://grand.test.com/", "https://example.com/", 
          "http://.big.time.sample.com/")

およびそれに続く可能性のあるものはすべて削除し".com"、最初の部分を保持します。

urls <- sapply(strsplit(urls, split="(?<=.)(?=\\.com)", perl=T), "[", 1) 

urls
# [1] "http://grand.test"    "https://example"      "http://.big.time.sample"

次のステップは、チェーン呼び出しでhttp://andの部分を削除することです。https://gsub()

urls <- gsub("^http://", "",  gsub("^https://", "", urls))

urls
# [1] "grand.test"       "example"          ".big.time.sample"

しかし、ここで助けが必要です。URL の 1 番目と 3 番目の文字列で会社名の前にある複数のピリオド (ドット) を処理するにはどうすればよいですか? たとえば、次の呼び出しでは、"example"文字列にピリオドが残っていないため、2 番目の文字列に対して NA が返されます。または、最初の部分だけを保持すると、会社名が失われます。

urls  <- sapply(strsplit(urls, split = "\\."), "[", 2)
urls
# [1] "test" NA     "big"

urls  <- sapply(strsplit(urls, split = "\\."), "[", 1)
urls
# [1] "grand"   "example" ""  

おそらく、ifelse()残りのピリオドの数をカウントし、複数のピリオドがある場合にのみ strsplit を使用する呼び出しでしょうか? また、会社名の前に 2 つ以上のピリオドがある可能性があることに注意してください。私の問題を解決するかもしれないルックアラウンドを行う方法がわかりません。しかし、これはしませんでした

strsplit(urls, split="(?=\\.)", perl=T)

ご提案ありがとうございます。

4

7 に答える 7

3

もっと簡単な方がいいと思いますが、これは機能します:

 sub('.*[.]','',sub('https?:[/]+[.]?(.*)[.]com[/]','\\1',urls))
 [1] "test"    "example" "sample" 

「urls」は最初の url のベクトルです。

于 2014-06-19T22:12:11.980 に答える
3

「.com」の前に単語を抽出する方法があると思いますが、アイデアが得られるかもしれません

sub(".com", "", regmatches(urls, gregexpr("(\\w+).com", urls)))
于 2014-06-19T22:14:25.223 に答える
3

他の方法よりも理解しやすく、一般化するのが簡単な方法を次に示します。

pat = "(.*?)(\\w+)(\\.com.*)"
gsub(pat, "\\2", urls)

これは、各文字列を 3 つのキャプチャ グループに分割して文字列全体に一致させ、必要なキャプチャ グループだけに置き換えることによって機能(2)します。

pat = "(.*?)(\\w+)(\\.com.*)"
#        ^    ^       ^
#        |    |       |
#       (1)  (2)     (3)  

編集(?修飾子の説明を追加)

キャプチャ グループ(1)には、「ungreedy」または「minimal」量指定子?( 「lazy」または「reluctant」とも呼ばれる) を含める必要があることに注意してください。基本的に、次のキャプチャ グループの一部になる可能性のある文字を使い果たすことなく、できるだけ多くの文字と一致するように正規表現エンジンに指示します(2)

末尾に がない?場合、反復量指定子はデフォルトで貪欲になります。この場合、貪欲なキャプチャ グループ は(.*)、任意の数の任意の種類の文字に一致するため、文字列内のすべての文字を「食べ尽くす」ことになり、他の 2 つのキャプチャ グループにはまったく何も残りません。これは、私たちが望む動作ではありません!

于 2014-06-20T01:12:23.027 に答える
2

を使用strsplitすることも試してみる価値があるかもしれません:

sapply(strsplit(urls,"/|\\."),function(x) tail(x,2)[1])
#[1] "test"    "example" "sample"
于 2014-06-19T22:37:07.820 に答える
2
于 2014-06-20T17:39:32.140 に答える
1

stringr::word()と一緒に使用できますbasename()

basename()URL を操作するときに便利です。

> library(stringr)
> word(basename(urls), start = -2, sep = "\\.")
# [1] "test"    "example" "sample"  

basename(urls)与える

[1] "grand.test.com"       "example.com"          ".big.time.sample.com"

次に、関数内で、区切り文字が( ) であることを前提としてword()、最後から 2 番目の単語 ( ) を取得します。start = -2.sep = "\\."

于 2014-06-19T22:37:35.887 に答える
1

正規表現オプションが十分にないため、regcapturedmatches.R関数を使用したものを次に示します。

regcapturedmatches(urls, regexpr("([^.\\/]+)\\.com", urls, perl=T))

戻り値に単純なベクトルが必要な場合はunlist()、結果を取得できます。「.com」の直前のドットまたは「/」以外のすべてを取得するパターンのアイデア。

于 2014-06-19T22:46:44.283 に答える