5

次のような文字列があります。

x <- "01(01)121210(01)0001"

これをベクトルに分割して、次のようにします。

[1] "0" "1" "(01)" "1" "2" "1" "2" "1" "0" "(01)" "0" "0" "0" "1"

(|) は [|] または {|} にすることができ、角かっこの間の桁数は 2 以上にすることができます。

最初に括弧で区切ることでこれをやろうとしました:

unlist(strsplit(x, "(?<=[\\]\\)\\}])", perl=T))
[1] "01(01)" "121210(01)" "0001"

or unlist(strsplit(x, "(?<=[\\[\\(\\{])", perl=T))
[1] "01(" "01)121210(" "01)0001"

しかし、この 2 つを組み合わせる方法が見つかりません。次に、括弧を含まない要素を分割したいと考えていました。

誰かがこれで私を助けてくれるか、これを行うよりエレガントな方法を知っていれば、本当に感謝しています。

どうもありがとう!

4

4 に答える 4

4

PERL オプションを TRUE に変更し、以下のパターンに基づいて入力文字列を分割するだけです。

(?<!\(|^)(?!\)|\d\)|$)

デモ

R正規表現は、

"(?<!\\(|^)(?!\\)|\\d\\)|$)"
于 2014-08-06T12:25:53.717 に答える
3

これは別の方法です:

unlist(strsplit(x, '\\([^)]*\\)(*SKIP)(*F)|(?=)', perl=T))
# [1] "0"    "1"    "(01)" "1"    "2"    "1"    "2"    "1"    "0"    "(01)" "0"    "0"    "0"    "1" 

\\([^)]*\\)は括弧内のすべてのものと一致し(*SKIP)(*F)、正規表現エンジンにこのパターンで失敗するように指示します。文字列内にそのパターンが見つかった場合は、文字列の反対側の代替パターンを使用して文字列のその部分を再テストしないでください|。の反対側のパターン|(?=)で、これは文字間のスペースに一致します。

于 2014-08-06T12:44:10.737 に答える
1

別の可能な方法:

unlist(strsplit(x, '(?!\\(?\\d*\\))', perl=T))

Matthew Plourde の方法よりも短いが、効率が悪い

またはG.グロタンディークが書いたような方法:

m<-gregexpr("\\d|\\([^)]*\\)", x)
regmatches(x, m)
于 2014-08-06T13:00:07.383 に答える