2017-06-30 4 views
1

ここでは、「Charlie」の前に単語(空白を除く)を抽出しています。プログラミング:正規表現を使用して文字列を抽出する(白いスペースを除く)

a = 'Charlie is at the pet shop.' 
b = ' Charlie is at the pet shop.' 
c = 'Jane saw Charlie at the pet shop.' 

私がこれまで試みられてきた:

> gsub('(.*?)((\\s)*Charlie).*','\\1',a) 
[1] "" 
> gsub('(.*?)((\\s)*Charlie).*','\\1',b) 
[1] " " 
> gsub('(.*?)((\\s)*Charlie).*','\\1',c) 
[1] "Jane saw " 

私が達成したいこと:作品上記のコードがない理由

[1] "" 
[1] "" 
[1] "Jane saw " 

は、私が知っているかもしれませんか?また、正規表現のパターンを修正して、私が望むものを達成できるようにするには?

答えて

2

なぜないだけで、

sub('Charlie.*', '', x) 
#[1] ""   " "  "Jane saw " 

それとも

sub('Charlie.*', '', trimws(x)) 
#[1] ""   ""   "Jane saw " 
+1

Rにtrimws()関数があることを知らなかった!手伝ってくれてどうもありがとう! :) – OinkOink

+1

はい、文字列の最後まで最初の 'Charlie'で始まるすべてのテキストを削除するのがポイントであれば、これは機能します。しかし、1回の交換が予想されるので、 'gsub'ではなく' sub'を使用します。 –

+0

良い点@WiktorStribiżew。ありがとう – Sotos

3

それはsubでかなり見ていませんが、それは次のように行うことができます。

> sub(".*?(\\S+(?:\\s+\\S+)*)\\s+Charlie.*|.+", "\\1", x) 
[1] ""   ""   "Jane saw" 

詳細

  • .*?から
  • (\\S+(?:\\s+\\S+)*)できるだけ少ないとして任意の文字、 - グループ1(\\1):
    • \\S+から1以上の非空白文字
    • (?:\\s+\\S+)* - 1+空白
    • Charlie - - サブ1+空白のゼロまたはそれ以上の配列が1+の非空白文字
  • \\s+
  • と続きます
  • .*から
  • |文字列の末尾までの任意の0+文字 - または
  • .+ - 任意の文字1+ stringrstr_extract

(文字列をゼロに)、それは良くなります:

> library(stringr) 
> res <- str_extract(x, "\\S+(?:\\s+\\S+)*(?=\\s+Charlie\\b)") 
> res 
[1] NA   NA   "Jane saw" 

"\\S+(?:\\s+\\S+)*(?=\\s+Charlie\\b)"試合1+非空白文字、そして0+のシーケンスを1つ以上の空白と1つ以上の非空白の直後には、1つの空白を含むとその後に全体としてのCharlieが続きます。

EDIT

だけ@Sotos answer上に追加する:あなたが期待されている唯一の交換以来subの代わりgsubを使用することができ、あなたは前にスペースを「トリム」もCharlie\s*と:

> sub('\\s*Charlie.*', '', x) 
[1] ""   ""   "Jane saw" 
ここで

  • \\s*は - ... 0+空白文字の最初のセットは続い見つけ
  • Charlie - 文字列の最後までの任意の0+文字 -
  • .*続くサブCharlie
+0

非常に詳細な説明をありがとう!それは確かに私のコードを理解するのに役立った! :) – OinkOink

+0

いつものように素晴らしいオプション! – akrun

+0

FYI:質問で判断すると、2番目の解決策では単語境界の必要はありませんが、質問に* words *を記述すると自動的に挿入されることがよくあります。テキストに 'Charlies'が含まれている場合にマッチする必要がある場合は、' \ b'を削除してください。 –

関連する問題