2013-05-06 4 views
9

Я очищаю текстовые строки в R. Я хочу удалить все знаки препинания кроме апострофы и дефисы. Это означает, что я не могу использовать класс символов [:punct:] (если не существует способа сказать [:punct:] but not '-)., когда [: punct:] is too much

! " # $ % & () * + , ./: ; <=> ? @ [ \ ]^_ { | } ~. и обратная сторона должна выйти.

Для большей части вышесказанного экранирование не является проблемой. Но для квадратных скобок у меня действительно проблемы. Вот что я пытался:

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[]" 

Я предпочел бы не использовали fixed=TRUE с gsub так, что помешает мне использовать класс символов. Итак, как включить квадратные скобки в класс символов регулярных выражений?

ETA дополнительные испытания:

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: единственная замена была вызвана не устанавливая perl=T в моих gsub вызовов. то есть:

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

ответ

12

Вы можете использовать [:punct:], если объединить его с negative lookahead

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

Таким способом [:punct:] только совпадают, если это не в ['-]. Это условие является отрицательным прогнозом (?!['-]). Он не работает, когда следующий символ равен ' или -, а затем полное выражение не выполняется.

+1

И использовать это в R, вы бы выполнили 'gsub (" (?! ['-]) [[: punct:]] "," ", x, perl = TRUE)' где 'x <-"' -! # $% &() * +,./:; <=>? @ []^_ {|} ~ \\ "', например. –

+0

@ JoshO'Brien, спасибо за пример R. – stema

+0

Уход! И когда я вспомнил о включении 'perl = T' в мой вызов' gsub', он работал отлично. – dnagirl

2

Внутри класса персонажа вам нужно только, чтобы избежать закрытия квадратные скобки:

Попробуйте с помощью '[[\\]]' или '[[\]]' (я не уверен, что избежать обратной косой черты, как я не знаю, R.)

См. this example.

+0

Похоже, что в R это производит только одну подстановку, которая рассматривает '[]' как шаблон, а не набор символов. Я обновил свой вопрос, включив этот тест. – dnagirl

+0

... и я обновил его снова с исправлением этой проблемы, которое позволяет вашему решению работать. – dnagirl

+0

@ dnagirl: Приятно, спасибо. –