R でテキスト文字列をクリーニングしています。アポストロフィとハイフンを除くすべての句読点を削除したいと考えています。これは、[:punct:]
文字クラスを使用できないことを意味します (言い方がない限り[:punct:] but not '-
)。
! " # $ % & ( ) * + , . / : ; < = > ? @ [ \ ] ^ _ { | } ~.
そしてバックティックが出なければなりません。
上記のほとんどの場合、エスケープは問題になりません。しかし、角括弧の場合、私は本当に問題を抱えています。これが私が試したことです:
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
エラー: '[' は、"[[" で始まる文字列の認識されないエスケープです
gsub('[\\[\\]]', 'B', 'it[]') #double escape, single substitution
# [1] "itB"
gsub('[\\]\\[]', 'B', 'it[]') #double escape, reversed order, NO substitution
# [1] "it[]"
文字クラスを使用できなくなるため、fixed=TRUE
withを使用しないことをお勧めします。gsub
では、正規表現文字クラスに角括弧を含めるにはどうすればよいでしょうか?
ETA 追加トライアル:
gsub('[[\\]]', 'B', 'it[]') #double escape on closing ] only, single substitution
# [1] "itB"
gsub('[[\]]', 'B', 'it[]') #single escape on closing ] only, expected error
エラー: ']' は、"[[]" で始まる文字列の認識されないエスケープです
ETA: 単一の置換はperl=T
、gsub
呼び出しで設定しなかったことが原因でした。すなわち:
gsub('[[\\]]', 'B', 'it[]', perl=T)