18

Rのstrsplit関数は、指定された正規表現を照合して削除し、残りの文字列をベクトルに分割します。

>strsplit("abc123def", "[0-9]+")
[[1]]
[1] "abc" ""    ""    "def" 

しかし、正規表現を使用して同じ方法で文字列を分割し、一致を保持するにはどうすればよいですか?次のようなものが必要です。

>FUNCTION("abc123def", "[0-9]+")
[[1]]
[1] "abc" "123" "def" 

ここでは、strapply( "abc123def"、 "[0-9] + | [az] +")を使用しても機能しますが、一致以外の文字列の残りを正規表現でキャプチャできない場合はどうなりますか?

4

3 に答える 3

25

基本的に、あなたが望んでいるのは、分割するのではなく、他のすべて[0-9]+の間の移行で分割することだと私には思え[0-9]+ます。文字列では、その遷移は既存のものではありません。gsubそれを挿入するには、次のコマンドを使用して前処理し、逆参照することができます。

test <- "abc123def"
strsplit( gsub("([0-9]+)","~\\1~",test), "~" )

[[1]]
[1] "abc" "123" "def"
于 2012-06-13T11:51:34.393 に答える
9

ルックアラウンド アサーションを使用できます。

> test <- "abc123def"
> strsplit(test, "(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)", perl=T)
[[1]]
[1] "abc" "123" "def"
于 2015-03-22T07:00:16.763 に答える
2

gsubfnパッケージのストラップを使用できます。

test <- "abc123def"
strapply(X=test,
         pattern="([^[:digit:]]*)(\\d+)(.+)",
         FUN=c,
         simplify=FALSE)

[[1]]
[1] "abc" "123" "def"
于 2012-06-13T15:03:31.267 に答える