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)
Und um das in R zu verwenden, würden Sie 'gsub (" (?! ['-]) [[: punct:]] "," ", x, perl = TRUE)' where 'x <-"' -! # $% &() * +,./:; <=>? @ []^_ {|} ~ \\ "' zum Beispiel. –
@ JoshO'Brien, danke für das R Beispiel. – stema
Ordentlich! Und als ich mich daran erinnerte, "perl = T" in meinen 'gsub'-Call einzuschließen, funktionierte es perfekt. – dnagirl