13

キャプチャ グループ(括弧) と文字列を含む正規表現が与えられた場合、キャプチャ グループに一致するすべての部分文字列、つまり通常 "\1"、"\2" で参照される部分文字列を取得するにはどうすればよいですか?

例: "xy" で始まる数字をキャプチャする正規表現を考えてみましょう:

s <- "xy1234wz98xy567"

r <- "xy(\\d+)"

望ましい結果:

[1] "1234" "567" 

最初の試行: gregexpr:

regmatches(s,gregexpr(r,s))
#[[1]]
#[1] "xy1234" "xy567" 

パターン全体に一致する部分文字列を返すため、私が望むものではありません。

2 回目の試行: regexec:

regmatches(s,regexec("xy(\\d+)",s))
#[[1]]
#[1] "xy1234" "1234" 

パターン全体とキャプチャ グループの最初の一致のみを返すため、私が望むものではありません。

extendsとして拡張するgregexec関数があれば、私の問題は解決されます。regexecgregexprregexpr

問題はregmatches、任意の正規表現でキャプチャ グループに一致するすべての部分文字列 (または上記の例のように渡すことができるインデックス) を取得する方法です。

注: 上記のパターンrはばかげた例に過ぎず、任意のままにしておく必要があります。

4

3 に答える 3

11

ベースでこれを行うかどうかはわかりませんが、必要なパッケージは次のとおりです。

library(stringr)

str_match_all(s, r)
#[[1]]
#     [,1]     [,2]  
#[1,] "xy1234" "1234"
#[2,] "xy567"  "567" 

多くのstringr関数はベース R にも類似しているため、 を使用せずにこれを実現することもできますstringr

たとえば、ベース R を使用して、上記の仕組みを簡略化したバージョンを次に示します。

sapply(regmatches(s,gregexpr(r,s))[[1]], function(m) regmatches(m,regexec(r,m)))
于 2013-09-04T18:11:08.317 に答える
8

strapplycgsubfn パッケージでそれを行います:

> library(gsubfn)
>
> strapplyc(s, r)
[[1]]
[1] "1234" "567" 

?strapplyc追加情報と例を試してください。

関連機能

1)の一般化strapplycstrapply、同じパッケージ内にあります。各試合のキャプチャされた部分を入力する関数を取り、関数の出力を返します。関数が の場合、cに減少しstrapplycます。たとえば、結果を数値として返したいとします。

> strapply(s, r, as.numeric)
[[1]]
[1] 1234  567

2) gsubfnは、同じパッケージ内の別の関連機能です。gsub置換文字列が置換関数 (または置換リストまたは置換 proto オブジェクト) になる可能性があることを除いて、似ています。置換機能は、キャプチャされた部分を入力し、置換を出力します。置換は、入力文字列の一致を置き換えます。この例のように式を使用すると、式の右辺が関数本体と見なされます。この例では、一致を次のものに置き換えXY{#}ます。ここで、# は一致した入力番号の 2 倍です。

> gsubfn(r, ~ paste0("XY{", 2 * as.numeric(x), "}"), s)
[1] "XY{2468}wz98XY{1134}"

更新: 追加さstrapplygsubfnた例。

于 2013-09-05T03:24:33.640 に答える