2013-05-06 13 views
9

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) 

Odpowiedz

12

Można użyć [:punct:], kiedy można połączyć go z negative lookahead

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

ten sposób [:punct:] dorównuje tylko, jeśli nie jest w ['-]. Twierdzenie to zapewnia ujemna twierdzenie z wyprzedzeniem o numerze (?!['-]). Zawodzi, gdy następny znak jest ' lub -, a następnie pełne wyrażenie nie powiedzie się.

+1

I żeby użyć tego w R, zrobiłbyś 'gsub (" (?! ['-]) [[: punct:]] "," ", x, perl = TRUE)' gdzie 'x <-"' -! # $% &() * +,./:; <=>? @ []^_ {|} ~ \\ "' na przykład. –

+0

@ JoshO'Brien, dzięki za przykład R. – stema

+0

Schludny! A kiedy przypomniałem sobie o włączeniu 'perl = T' w moim wywołaniu' gsub', zadziałało idealnie. – dnagirl

2

wewnątrz klasy znaków tylko trzeba uciec zamykający nawias kwadratowy:

spróbuj '[[\\]]' lub '[[\]]' (nie jestem pewien, o ucieczce backslash jak nie wiem R.)

Zobacz this example.

+0

wydaje się, że w R, to produkuje tylko pojedyncze podstawienie, które traktuje '[]' jako wzorzec, a nie zbiór znaków. Zaktualizowałem moje pytanie, aby uwzględnić ten test. – dnagirl

+0

... i zaktualizowałem go ponownie, poprawiając ten problem, który pozwala na działanie twojego rozwiązania. – dnagirl

+0

@dnagirl: Ładne, dzięki. –