Sprzątam ciągi tekstowe w R. Chcę usunąć wszystkie interpunkcje z wyjątkiem apostrofów i łączników. Oznacza to, że nie mogę używać klasy znaków [:punct:]
(chyba że istnieje sposób na powiedzenie [:punct:] but not '-
).gdy [: punct:] jest za dużo
! " # $ % & () * + , ./: ; <=> ? @ [ \ ]^_ { | } ~.
i musi wyjść.
Dla większości z powyższych, ucieczkę nie stanowi problemu. Ale w nawiasach kwadratowych naprawdę mam problemy. Oto, co starałem:
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[]"
wolałbym, aby nie stosować fixed=TRUE
z gsub
ponieważ uniemożliwi mnie z klasy znaku. A więc, w jaki sposób dodać nawiasy kwadratowe do klasy znaku regex?
ETA dodatkowe badania:
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: pojedyncza substytucja nie została spowodowana przez ustawienie perl=T
w moich gsub
połączeń. tj:
gsub('[[\\]]', 'B', 'it[]', perl=T)
I żeby użyć tego w R, zrobiłbyś 'gsub (" (?! ['-]) [[: punct:]] "," ", x, perl = TRUE)' gdzie 'x <-"' -! # $% &() * +,./:; <=>? @ []^_ {|} ~ \\ "' na przykład. –
@ JoshO'Brien, dzięki za przykład R. – stema
Schludny! A kiedy przypomniałem sobie o włączeniu 'perl = T' w moim wywołaniu' gsub', zadziałało idealnie. – dnagirl