私はおそらく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ページを指し示すためのボーナスマーク。
次のようなことができます:
pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice)
パターンが一致するalice
のサブセットのみが必要な場合は、これを試してください:
pat <- ".*\\.D([0-9]+)\\.LIS.*"
sub(pat, "\\1", alice[grepl(pat, alice)])
Stringrパッケージを試してください:
library(stringr)
str_match(alice, ".*\\.D([0-9]+)\\.LIS.*")[, 2]