2016-12-14 5 views
3

したがって、dayまたはの表示が続く数字のシーケンスを含むベクトルvがあります。唯一dayのシーケンスを選択したいと思います。数字のシーケンスの後のr - grep OR

v = c('abc_1day', 'abc_2day', 'abc_3day', 'abc_1week', 'abc_2dweek') 

私はそれがないのはなぜor条件がここに

v[grep('abc_|day', v)] 

働くだろうと思いましたか?

+2

'v [grep( 'abc _ \\ d +日'、v)]'または 'grep( 'abc _ \\ d +日'、v、値= TRUE)'を試してください。 '' abc_ | day''パターンは、 '' abc_' *または* 'day'のいずれかと一致します。すべての項目に 'abc_'が含まれているので、あなたは現在のパターンでそれらをすべて取得します。 –

答えて

1

我々は

grep('^abc_[0-9]+day$', v, value = TRUE) 
#[1] "abc_1day" "abc_2day" "abc_3day" 

NOTEを使用することができます。これは、文字列の末尾に日が続く数字のOPの基準を考慮し、「ABC」で始まります。

2

greplを使用する:

v[grepl("day", v)] 

をこれだけでトークンとしてdayがしたいエントリと一致するのに十分であることを前提としています。そうでない場合は、正規表現を変更できます。また、あなたが使用することができますday前に番号を一致させるには:

v[grepl("\\d+day", v)] 
+0

ここで 'd +'は何をしているのですか?ありがとう – giacomo

+0

'\\ d +'は "任意の(少なくとも1つの)連続する桁のセット"と言います。 '[0-9] +'と等価です。 – lmo

1

をOR条件はabc_dayのいずれかに一致しています。

オプションの1つは、それがabc_が付け加えている場合のみ、dayが一致する基準と数字を満たす\Kを、使用することです:これはakrunのgrep('^abc_[0-9]+day$', v, value = TRUE)、文字列全体に一致するとは異なり

v[grep('abc_[0-9]+\\Kday', v, perl = TRUE)] 
[1] "abc_1day" "abc_2day" "abc_3day" 

。特に、\Kの有用な利点は、lookaroundsよりも可変長であることができることである。

関連する問題