2013-05-06 23 views
9

Ich bin Reinigung von Textzeichenfolgen in R. Ich möchte alle Interpunktion außer Apostrophen und Bindestriche entfernen. Das bedeutet, dass ich die Zeichenklasse [:punct:] nicht verwenden kann (es sei denn, es gibt eine Möglichkeit, [:punct:] but not '- zu sagen).wenn [: punct:] ist zu viel

! " # $ % & () * + , ./: ; <=> ? @ [ \ ]^_ { | } ~. und Backtick muss herauskommen.

Für die meisten der obigen Fälle ist die Flucht kein Problem. Aber für eckige Klammern habe ich wirklich Probleme. Hier ist, was ich versucht habe:

gsub('[abc]', 'L', 'abcdef') #expected behaviour, shown as sanity check 
# [1] "LLLdef" 

gsub('[[]]', 'B', 'it[]') #only 1 substitution, ie [] treated as a single character 
# [1] "itB" 

gsub('[\[\]]', 'B', 'it[]') #single escape, errors as expected 

Error: '[' is an unrecognized escape in character string starting "'[["

gsub('[\\[\\]]', 'B', 'it[]') #double escape, single substitution 
# [1] "itB" 

gsub('[\\]\\[]', 'B', 'it[]') #double escape, reversed order, NO substitution 
# [1] "it[]" 

Ich würde es vorziehen, nicht fixed=TRUE mit gsub verwendet, da die mich von der Verwendung einer Zeichenklasse zu verhindern. Wie schließe ich also eckige Klammern in eine Regex-Zeichenklasse ein?

ETA weitere Studien:

gsub('[[\\]]', 'B', 'it[]') #double escape on closing ] only, single substitution 
# [1] "itB" 

gsub('[[\]]', 'B', 'it[]') #single escape on closing ] only, expected error 

Error: ']' is an unrecognized escape in character string starting "'[[]"

ETA: die einzige Substitution von nicht Einstellung perl=T in meinem gsub Anruf verursacht wurde. dh:

gsub('[[\\]]', 'B', 'it[]', perl=T) 

Antwort

12

Sie [:punct:] verwenden können, wenn Sie es mit einem auf diese Weise kombinieren negative lookahead

(?!['-])[[:punct:]] 

ein [:punct:] nur abgestimmt ist, wenn es nicht in ['-] ist. Die negative Lookahead Assertion (?!['-]) stellt diese Bedingung sicher. Es wird fehlgeschlagen, wenn das nächste Zeichen ein ' oder ein - ist und dann der vollständige Ausdruck fehlschlägt.

+1

Und um das in R zu verwenden, würden Sie 'gsub (" (?! ['-]) [[: punct:]] "," ", x, perl = TRUE)' where 'x <-"' -! # $% &() * +,./:; <=>? @ []^_ {|} ~ \\ "' zum Beispiel. –

+0

@ JoshO'Brien, danke für das R Beispiel. – stema

+0

Ordentlich! Und als ich mich daran erinnerte, "perl = T" in meinen 'gsub'-Call einzuschließen, funktionierte es perfekt. – dnagirl

2

Innerhalb einer Zeichenklasse Sie nur die schließende eckige Klammer entkommen müssen:

mit '[[\\]]' oder '[[\]]' Versuchen (Ich bin nicht sicher über den Backslash, wie ich weiß R. nicht)

Siehe this example.

+0

Es scheint, dass in R, dies nur eine einzige Substitution erzeugt, die '[]' als ein Muster und nicht als eine Menge von Zeichen behandelt. Ich habe meine Frage aktualisiert, um diesen Test einzuschließen. – dnagirl

+0

... und ich habe es erneut mit einer Fehlerbehebung für dieses Problem aktualisiert, die es Ihrer Lösung ermöglicht zu arbeiten. – dnagirl

+0

@dnagirl: Nett, danke. –