2016-11-11 3 views
1

以下に示すaのような文字列があります。私はの最初の文字列の一部を最初に抽出する必要があります//と最初の後に/です。私はsubperl = Fを使用しますが、それは約の約4倍です。だから私はperl = Tを試して、文字列の終わりから検索が始まることが分かった??R sub with perl - 後方検索を開始しますか?

a = "https://moo.com/meh/woof//A.ds.serving/hgtht//ghhg/tjtke" 
    print(gsub(".*//(.*?)/.*","\\1",a)) 

    "moo.com" 

    print(gsub(".*//(.*?)/.*","\\1",a,perl=T)) 

    "ghhg" 

moo.comです。私はこれを見て非常に驚いています - それはどこかで文書化されていますか? perlで再書き込みするにはどうすればいいですか?20M行で作業する必要があり、速度が重要です。ありがとう!

編集:それはすべての文字列がhttp

+0

あなたは 'urltools'パッケージについて知りましたか?そのようなタスクに便利になる – Sotos

+0

TRE正規表現では、怠惰な量詞を欲張りなものと混ぜることはお勧めできません。場合によっては、期待どおりに動作しますが、動作しない場合もあります。そのような状況では 'perl = TRUE'を使い、'。* 'は可能な限り多くの文字にマッチし、'。*? 'は可能な限り少数の文字にマッチしますが、' perl = TRUE'改行記号には一致しません。それが必要な場合は、パターン開始時に '(?s)'を追加します。 –

答えて

1

で開始することをあなたは//が最初//インスタンスが一致するように、あまりにも最初.*怠惰にする.*?//(.*?)/.*を試すことができます与えられていない。

gsub(".*?//(.*?)/.*","\\1",a,perl=T) 
# [1] "moo.com" 

そして、 ?gsub

標準正規表現コードはveであると報告されていますry slow 極端に長い文字列に適用された場合( 文字以上):perl = TRUEのときに使用されるコードは、はるかに高速であるようです そしてそのような用途ではより信頼できます。

gsubの標準バージョンでは、単語の境界(例:pattern = "\ b")が正しく置換されません。そのような の一致にperl = TRUEを使用してください。

+0

ありがとう!しかし、 'perl = F'と' T'はなぜ違う振る舞いをするのでしょうか? –

+0

それは良い質問です。実際に私は確信していません、現時点ではドキュメントを見つけることができません。私は 'gsub'関数がどのように機能するかと関係があると思います。 – Psidom

関連する問題