web-dev-qa-db-ja.com

R:文字列全体ではなく、grepが一致を返す方法

私はおそらくR質問で本当に愚かなgrepであるものを持っています。申し訳ありませんが、これはとても簡単に思えるので、明らかに何かが欠けています。

文字列のベクトルがあります。aliceと呼びましょう。 aliceの一部を以下に出力します:

_T.8EFF.SP.OT1.D5.VSVOVA#4   
T.8EFF.SP.OT1.D6.LISOVA#1  
T.8EFF.SP.OT1.D6.LISOVA#2   
T.8EFF.SP.OT1.D6.LISOVA#3  
T.8EFF.SP.OT1.D6.VSVOVA#4    
T.8EFF.SP.OT1.D8.VSVOVA#3  
T.8EFF.SP.OT1.D8.VSVOVA#4   
T.8MEM.SP#1                
T.8MEM.SP#3                      
T.8MEM.SP.OT1.D106.VSVOVA#2 
T.8MEM.SP.OT1.D45.LISOVA#1  
T.8MEM.SP.OT1.D45.LISOVA#3
_

これらの文字列の一部に表示されるDの後に、「LIS」と空の文字列または他の何かを含む文字列を条件として、grepに番号を教えてください。

Grepが文字列全体ではなく、キャプチャグループの値を返すことを望んでいました。これが私のR風味の正規表現です。

_pattern <- (?<=\\.D)([0-9]+)(?=.LIS)
_

あまり複雑ではありません。しかし、単にgrep(pattern, alice, value = TRUE, Perl = TRUE)を使用するのではなく、私が求めているものを取得するために、次のことを行っていますが、これは悪いようです:

_reg.out <- regexpr(
    "(?<=\\.D)[0-9]+(?=.LIS)",
    alice,
    Perl=TRUE
)
substr(alice,reg.out,reg.out + attr(reg.out,"match.length")-1)
_

今見てみると、あまりくはないように見えますが、このまったく些細なことを機能させるために必要な混乱は恥ずかしいものです。誰でもこれを適切に行う方法についてのポインタはありますか?

_$_、_@_とattrを使用してアクセスするものの違いを説明するWebページを指し示すためのボーナスマーク。

50
Mike Dewar

次のようなことができます:

pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice)

パターンが一致するaliceのサブセットのみが必要な場合は、これを試してください:

pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice[grepl(pat, alice)])
37
Ken Williams

Stringrパッケージを試してください:

library(stringr)
str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]
53
hadley