2016-08-26 1 views
2

I ' m R 데이터 프레임에서 열에 저장된 작은 문자열 (1 ~ 3 자)을 정리합니다. 특히, 다음 R 스크립트를 가정 : 첫 번째 필터 (^|\\s)[A-Z]{1,2}($|\\s)는 세 번째의 첫 번째 행 또는 "YZ"의 "H"를 대체하지 않는 이유

df = data.frame("original" = c("ABCDE FG H", 
          "IJKL MN OPQRS", 
          "TUV WX YZ AAAA")) 
df$filter1 = gsub("(^|\\s)[A-Z]{1,2}($|\\s)", " ", df$original) 
df$filter2 = gsub("\\b[A-Z]{1,2}\\b", " ", df$original) 

> df 

     original | filter1 | filter2 | 
1  ABCDE FG H | ABCDE H | ABCDE | 
2 IJKL MN OPQRS | IJKL OPQRS | IJKL OPQRS| 
3 TUV WX YZ AAAA | TUV YZ AAAA| TUV AAAA | 

내가 이해가 안 돼요. 나는 필터 (filter2 컬럼)로 \\b[A-Z]{1,2}\\b을 사용하는 것과 같은 결과를 기대할 것이다. 여러 개의 공백에 대해 걱정하지 마시고, 저에게 중요하지 않습니다 (이것이 문제가되지 않는 한 :)).

> gsub("A", "X", "AAAABBBBCCCDDDDAAAAAAAEEE") 
[1] "XXXXBBBBCCCDDDDXXXXXXXEEE" 
:

나는 문제가 그 첫 번째는 두 번째를 대체하지 찾은 경우는,하지만 난 다음 교체 할 경우는 TRUE 아니라고, 작업의 "세계 성"이라고 생각

그래서 결과가 다른 이유는 무엇입니까?

답변

3

요점은 gsub이며 은 겹치지 않는 문자열과 일치 할 수 있습니다. FG이 첫 번째 예상 일치이고 H 두 번째 문자열 인 경우 과 겹쳐서 이후에 "(^|\\s)[A-Z]{1,2}($|\\s)" 뒤에 공백이 들어가면 H이 패턴과 일치하지 않습니다.

Look : ABCDE FG H은 왼쪽에서 오른쪽으로 분석됩니다. 표현식은 FG과 일치하고 정규 표현식 색인은 H 앞에 있습니다. 이 편지 만 일치하지만 (^|\s)에는 공백이나 문자열의 시작이 필요합니다.이 위치에는 아무 것도 없습니다. (

df$filter1 = gsub("(^|\\s)[A-Z]{1,2}(?=$|\\s)", " ", df$original, perl=TRUE) 

또는

df$filter1 = gsub("(?<!\\S)[A-Z]{1,2}(?!\\S)", " ", df$original, perl=TRUE) 

당신이 필요로하는 경우에 실제로 소비 :

는 "수정"이 같은 논리를 사용하려면 lookarunds와 PCRE 정규식 gsub을 사용할 수 있습니다 제거하려면 공백을 넣기 전에 (또는 /) 뒤에 \\s*을 추가하십시오.

두 번째 표현식 "\\b[A-Z]{1,2}\\b" 단어 경계를 포함, 그들은 공간이 소모되지 않기 때문에, 따라서 정규식 엔진이 FGH 모두를 일치시킬 수 있습니다, 텍스트를 소비하지 않는 제로 폭 주장이다.

+0

감사합니다. 완벽하게 작동합니다. 내가 잘 이해하면 각 단계에서 대체가 이루어 지므로 각 검색에서 전체 문자열을 고려해야한다고 생각하는 것이 필요합니다. 그렇지 않습니까? 다시 감사합니다. – Amanda

+0

아니요, 요점은'gsub'는 * 중첩되지 않는 * 문자열에만 일치 할 수 있다는 것입니다. "FG"는 첫 번째 예상 경기이고 "H"는 두 번째 경기입니다. 이러한 문자열이 겹치는 것을 볼 수 있습니다. 나는 대답의 맨 위에 설명을 업데이트했다. –

+0

감사합니다. 정말 고마워요. – Amanda

관련 문제