2011-10-27 2 views
2

문자열에서 정규 표현식을 사용하여 일치하는 패턴, 그리고 여기 N.은 몇 가지 예입니다 :I는 0, 1로 구성된 문자열의 큰 숫자의 구성 데이터 프레임이

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

임 찾고 'N'존재가없는 '0'과 '1'만으로 구성된 문자열을 식별하는 방법입니다. 나의 궁극적 인 목표는이 상황이 발생하는 곳에서 나의 원본 데이터 프레임 'REC'로 대체하는 것입니다. 이 question에서 수행 된 것과 유사합니다.

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

내 목표를 달성하기 위해 (이전 질문에서 응답에 의해 인도) 필자가 사용 된 주요 전략은 gsub 사용하지만 작동 정규식을 얻을 캔트 :

내 위의 데이터에서 결과가 될 것이다 내 원하는 출력. 내가 여기에 여기에 시도하는 너무 많은 반복을 시도했지만 한 나의 가장 최근의 기능은 다음과 같다 :이 기능은 lapply

과 데이터 프레임에 필자에 의존 시도 다른 전략을 실행할 것

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

strsplit하지만 임씨도이 문제를 해결하는 데 어려움이 있습니다. 사람들이보고 싶으면 예제를 제공 할 수 있습니다. 나는 이것이 몇 가지 정규식 전문가를 위해 간단하게 될 것이라고 상상하지만 몇 시간 동안 노력한 후에, ID는 약간의 도움을 사랑한다!

답변

2

나는 당신이 당신의 정규식으로 무엇을 얻으려고하는지 잘 모르겠습니다.

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

효과적으로 의미

시작 문자열의 일치 적어도 하나의 0이 적어도 하나의 1과 문자열의 끝 다음, 아무것도 하였다. 그래서이 : 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

이 나던 잘 작동 그것은 좋아에만 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

이것은 op가 원하는 것이 아닌 1111111111111 = 일치하지 않습니다. – FailedDev

+0

네가 맞아, 내 나쁜 :) 나는 'N'측면에 초점을 맞추기에는 너무 바빴다. 나는 1의 문자열 만 일치해서는 안된다는 통지를하지 않았다. – carpii

2

을 따라, 당신은 할 수 :

귀하의 예를 몇 가지 들어 191,023,210

:이 연결

이제
> 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"