2012-11-14 2 views
7

모든 구두점을 제거하십시오. 공백이나 구두점으로 나뉘는 다음 정규식을 사용하고 있습니다. :punct:에서 1 개 이상의 구두점 문자를 제외하려면 어떻게해야합니까? 아포스트로피와 쉼표를 제외하고 싶다고합시다. 내가 명시 적으로 대신 [all punctuation marks in here]을 사용할 수 있지만 제외 방법을 기대하고있어.정규식;

X <- "I'm not that good at regex yet, but am getting better!" 
strsplit(X, "[[:space:]]|(?=[[:punct:]])", perl=TRUE) 

[1] "I"  "'"  "m"  "not"  "that" "good" "at"  "regex" "yet"  
[10] ","  ""  "but"  "am"  "getting" "better" "!" 

답변

8

그것은 당신이 결과이 원하는 것을 나에게 분명하지 않다, 그러나 당신은 부정적인 클래스 like this answer을 사용할 수 있습니다.

R> strsplit(X, "[[:space:]]|(?=[^,'[:^punct:]])", perl=TRUE)[[1]] 
[1] "I'm"  "not"  "that" "good" "at"  "regex" "yet," 
[8] "but"  "am"  "getting" "better" "!"  
+1

내 머리가 아파요보기 ... –

0

당신은 오른쪽 다음 문자가 ' 또는 , 경우 경기를 실패 (?![',])negative lookahead와 직접 PCRE의 서브 패턴에 제한을 부과 할 수있다 :

[[:space:]]|(?=(?![',])[[:punct:]]) 
       ^^^^^^^^ 

regex demo를 참조하십시오.

세부

  • [[:space:]] - 공백
  • | - 또는
  • (?=(?![',])[[:punct:]]) - 즉시 현재 위치의 오른쪽에, 더 ',이없는 것을 요구하는 긍정적 예측 ' 또는 ,이 아닌 1 개의 구두 문자가 있습니다 (실제로는이외의 구두 기호가 필요함).및 ,).

R online demo

X <- "I'm not that good at regex yet, but am getting better!" 
strsplit(X, "[[:space:]]|(?=(?![',])[[:punct:]])", perl=TRUE) 
[[1]] 
[1] "I'm"  "not"  "that" "good" "at"  "regex" "yet," 
[8] "but"  "am"  "getting" "better" "!"