2012-11-14 9 views
7

Ich habe die folgende Regex, die auf jedem Leerzeichen oder Interpunktion aufgeteilt wird. Wie kann ich 1 oder mehr Interpunktionszeichen von :punct: ausschließen? Nehmen wir an, ich möchte Apostrophe und Kommas ausschließen. Ich weiß, ich könnte [all punctuation marks in here] anstelle von [[:punct:]] explizit verwenden, aber ich hoffe auf eine Ausschlussmethode.Regex; Beseitigen Sie alle Interpunktionszeichen außer

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" "!" 

Antwort

8

Es ist mir nicht klar, was Sie das Ergebnis sein wollen, aber Sie könnten like this answer negativen Klassen verwenden können.

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

Mein Kopf tut weh ... –

0

Sie können eine Beschränkung auf einen PCRE Unter-Pattern verhängen direkt mit einem (?![',])negative lookahead, die nach rechts über das Spiel, wenn das nächste Zeichen nicht ist ' oder ,:

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

die regex demo See.

Einzelheiten

  • [[:space:]] - jedes Leerzeichen
  • | - oder
  • (?=(?![',])[[:punct:]]) - eine positive Vorschau, die rechts von der aktuellen Position, dass unmittelbar erfordert, gibt es keine ' und , und dass es 1 Interpunktionszeichen gibt, das kein ' oder , ist (was effektiv jedes Interpunktionssymbol außererfordertund ,).

Siehe 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" "!"