14

検索したところ、重複一致の効果を達成するためのこのフォーラム ディスカッションを見つけることができました。

また、このタスクを実行するためのインデックスを見つけることについて話している次のSOの質問も見つけましたが、R 言語で重複する一致を取得することについて簡潔なものを見つけることができませんでした。

このタスクは、( PCRE )をサポートするほとんどすべての言語で実行できます。正の先読みアサーションを使用し、先読み内にキャプチャ グループを実装して重複した一致をキャプチャします。

しかし、実際に他の言語と同じようにperl=TR を使用してこれを実行しても、結果は得られません。

> x <- 'ACCACCACCAC'
> regmatches(x, gregexpr('(?=([AC]C))', x, perl=T))[[1]]
[1] "" "" "" "" "" "" ""

stringistringrパッケージの両方を使用する場合も同様です。

> library(stringi)
> library(stringr)
> stri_extract_all_regex(x, '(?=([AC]C))')[[1]]
[1] "" "" "" "" "" "" ""
> str_extract_all(x, perl('(?=([AC]C))'))[[1]]
[1] "" "" "" "" "" "" ""

これを実行したときに返される正しい結果は次のとおりです。

[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"

編集

  1. regmatchesキャプチャされた一致でうまく機能しないことはよく知っていますが、regmatch でこの動作が発生する正確な原因と、結果が返されないのはなぜですか? やや詳細な回答を探しています

  2. stringiandstringrパッケージはこれを実行できませんかregmatches?

  3. 私の回答に自由に追加するか、私が見つけたものとは異なる回避策を考え出してください。

4

6 に答える 6

7

回避策として、これは重複する一致を抽出するために私が思いついたものです。

> x <- 'ACCACCACCAC'
> m <- gregexpr('(?=([AC]C))', x, perl=T)
> mapply(function(X) substr(x, X, X+1), m[[1]])
[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"

このタスクを実行するためのより良い方法を追加またはコメントしてください。

于 2014-09-12T02:56:48.267 に答える
4

これは正規表現ソリューションではなく、より重要な質問には実際には答えませんが、一度に 2 文字の部分文字列を使用して不要なCA要素を削除することで、目的の結果を得ることができます。

x <- 'ACCACCACCAC'
y <- substring(x, 1:(nchar(x)-1), 2:nchar(x))
y[y != "CA"]
# [1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
于 2014-09-13T02:54:47.370 に答える
4

私が過去に行ったのと同じ情報を抽出するもう 1 つの遠回りの方法は、 を に置き換えること"match.length"です"capture.length"

x <- c("ACCACCACCAC","ACCACCACCAC")
m <- gregexpr('(?=([AC]C))', x, perl=TRUE)
m <- lapply(m, function(i) {
       attr(i,"match.length") <- attr(i,"capture.length")
       i
     })
regmatches(x,m)

#[[1]]
#[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
#
#[[2]]
#[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"
于 2014-09-12T05:10:21.853 に答える
1

組み込みの R 関数のみを使用した、@hwnd 自身の回答 (オリジナルでは可変長のキャプチャ領域を許可していませんでした) に基づく追加の回答:

> x <- 'ACCACCACCAC'
> m <- gregexpr('(?=([AC]C))', x, perl=T)[[1]]
> start <- attr(m,"capture.start")
> end <- attr(m,"capture.start") + attr(m,"capture.length") - 1
> sapply(seq_along(m), function(i) substr(x, start[i], end[i]))
[1] "AC" "CC" "AC" "CC" "AC" "CC" "AC"

かなり醜いので、stringretc. パッケージが存在します。

于 2015-08-10T14:51:07.290 に答える