2017-02-25 6 views
1

私はRで正規表現を使用していますが、私はそれが左側部分では貪欲で、右側部分では貪欲でないことを望みます。単語「左」と「右」の間のテキストを抽出したいとしますが、それは貪欲で最後の出現が見つかるまでテキスト内の単語「left」を探し続けます。しかし、私はまた、それが "欲しい"のために非貪欲で、最初の出来事で止まることを望んでいます。このコードを変更するにはどうすればよいですか?代替としてある部分の貪欲な正規表現、他の部分の貪欲でない部分

gsub(".*left(.*)right.*", string)

、IはRでregexprを用いて単語の位置が記憶され、それは位置Xと位置Yとの間で正規表現を使用することが可能ですか?

答えて

1

Rの正規表現がPerlと互換性がある場合は? *(または+)の背後にある非欲張り一部ということになり:

Input: aaaabaaaaab 
Regex: `/a*?b/` 
Result: aaaab 
+0

私は 'aaaabbbbb'を持っていると私はちょうど' ab'をしたい場合はどう?すなわち、私はそれを欲張りにしたい、そして貪欲でないことをbにしたい。 – vdvaxel

+0

そして、/ ab /または/ a +?b +/ – Psi

1
string <- "A left bat ran after a left dog who is right but not too right." 
gsub("^.*left(.*?)right.*$", "\\1", "string) 

パターン.*leftは貪欲left最後発生するまで、すべてを消費して、パターン(.*?)rightまで、すべてを消費します最初にの出現がrightです。ここ

デモ:

Regex101

+0

と言うだけです。 「犬は誰?」 – vdvaxel

+0

これは 'dog is who is'を返します。 –

0

代替ここではstringiパッケージを使用することです。機能stri_replace_laststri_replace_firstあなたが必要とする正確に何をすべきか、すなわち、(ティムの答え@からstringを使用して)、

library(stringi) 

stri_replace_first(stri_replace_last(string, '', regex = '.*left '), '', regex = ' right.*') 
#[1] "dog who is" 
関連する問題