9

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=TRUEwithを使用しないことをお勧めします。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=Tgsub呼び出しで設定しなかったことが原因でした。すなわち:

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

2 に答える 2

12

否定的な先読み[:punct:]と組み合わせると、 を使用できます

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

この方法では、 a[:punct:]が にない場合にのみ一致し['-]ます。否定先読みアサーション(?!['-])は、この条件を保証します。次の文字が a'または a の-場合は失敗し、式全体が失敗します。

于 2013-05-06T13:22:44.660 に答える