2011-10-27 6 views
2

文字列に正規表現を用いたパターンマッチング、ここでN.は、いくつかの例です:私は0、1で構成される文字列の多数で構成されていたデータフレームを持って

a = "10000000011111111" 
b = "11111111111111111" 
c = "11111110000000NNN" 
d = "00000000000000000" 
e = "00000001111111111" 
f = "11111000000000000" 

Imが探して'0'と '1'の両方だけで構成された文字列を 'N'存在なしで識別する方法です。私の究極の目標は、この状況が発生する場所で私の元のデータフレーム「REC」に置き換えることです。このquestionで行われたのと同様です。

私の上記のデータからの結果は次のようになります。

a = "REC" 
b = "11111111111111111" 
c = "11111110000000NNN" 
d = "00000000000000000" 
e = "REC" 
f = "REC" 

私の目標を達成するために、(以前の質問からの応答によって導か)アイブ氏は採用の主な戦略はgsubを使用していますが、私は動作します正規表現を得るカント私の希望する出力のために。私はここにしようとするには余りにも多くの反復を試みたが、ここで私の最も最近の機能できた、次のとおりです。

markREC <- function(X) { 
gsub(X, pattern = "^(0)+.*(1)+$", 
     replacement = "REC?")} 

この関数は、アイブ氏が試した他の戦略が依拠lapply

でデータフレーム上で実行されるだろうstrsplitでも、これも問題なく動作しています。人々がそれらを見たいと思えば私は例を提供することができます。私はこれがいくつかの正規表現の専門家のためにシンプルになるだろうと思うが、試して何時間も後、IDはいくつかの助けが大好き!

答えて

2

私はあなたの正規表現で何を達成しようとしているのか分かりません。

^(0)+.*(1)+$ 

効果的意味:文字列の

スタート、少なくとも一つの1と文字列の末尾に続くもの、続く少なくとも1 0試合を。だから、この:032985472395871マッチ:)完全な文字列は、0と1のために構成されており、少なくとも一つの0と少なくとも一つがある場合にのみ

^(?=.*0)(?=.*1)[01]+$が一致します。1.

// ^(?=.*0)(?=.*1)[01]+$ 
// 
// Assert position at the beginning of the string «^» 
// Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=.*0)» 
// Match any single character that is not a line break character «.*» 
//  Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
// Match the character “0” literally «0» 
// Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=.*1)» 
// Match any single character that is not a line break character «.*» 
//  Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
// Match the character “1” literally «1» 
// Match a single character present in the list “01” «[01]+» 
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Assert position at the end of the string (or before the line break at the end of the string, if any) «$» 
+0

このdoesntのはかなりの仕事を、それがしたいだけ0または1のみのIDを持っている文字列を拾うので、このグループから除外します。 Iveは質問を自分の望む出力で編集しました。 –

+0

@SamGlobus実際これは完全に機能します。あなたが何を話しているのか分かりません。 – FailedDev

+0

二重引用符で囲まれた文字列に似た文字列にのみ有効です。文字列はデータフレーム内にあり、異なる長さになります。 –

0

適切な正規表現は次のとおりです。

"[^N]*" 

私は信じています。これは、Nが含まれていない限り、任意の長さの文字列と一致します。

+0

これは ""空文字列にも一致します。 – FailedDev

+0

まあ空の文字列はまだ文字列ではないですか? – BicMacinaPimpHat

0

この

^([01]*)[^01]+([01]*)$

マッチは、続いて0/1をイマイチ、少なくとも1文字が続く、0以上の0/1のに続いて、文字列の先頭試してみてください0以上0/1の(のみ0または1を含むのみ01(とない文字列を含む文字列を一致させるために)文字列の最後で

+0

これは、1111111111111 = opが望むものと一致しません。 – FailedDev

+0

あなたは正しい、私の悪い:私は 'N'の側面に焦点を合わせすぎて忙しかった、私はそれが1 – carpii

2

に従っ)、あなたができる:

あなたの例のいくつかについては

> grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", a) 
[1] TRUE 

> grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", b) 
[1] FALSE 

> grepl("^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", c) 
[1] FALSE 

今すぐgsubにこれを差し込む:

> gsub(a, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC") 
[1] "REC" 

> gsub(b, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC") 
[1] "11111111111111111" 

> gsub(c, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC") 
[1] "11111110000000NNN" 

> gsub(d, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC") 
[1] "00000000000000000" 

> gsub(e, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC") 
[1] "REC" 

> gsub(f, pattern="^((0)+(1)+(0|1)+)|((1)+(0)+(0|1)+)$", replacement="REC") 
[1] "REC" 
関連する問題