16

文字列のベクトルからアルファベット以外の文字を削除しようとしています。グループ化でカバーできると思ったの[:punct:]ですが、 . を無視しているよう+です。これは別のキャラクターグループに属しますか?

library(stringi)
string1 <- c(
"this is a test"
,"this, is also a test"
,"this is the final. test"
,"this is the final + test!"
)

string1 <- stri_replace_all_regex(string1, '[:punct:]', ' ')
string1 <- stri_replace_all_regex(string1, '\\+', ' ')
4

2 に答える 2

19

POSIX 文字クラスは、文字クラス内にラップする必要があります。正しい形式は [[:punct:]]. POSIX 用語の「文字クラス」を、正規表現文字クラスと通常呼ばれるものと混同しないでください。

この ASCII 範囲の POSIX 名前付きクラスは、すべての非制御文字、非英数字非スペース文字に一致します。

ascii <- rawToChar(as.raw(0:127), multiple=T)
paste(ascii[grepl('[[:punct:]]', ascii)], collapse="")
# [1] "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"

ただし、 a が有効な場合、 ...locale の動作が変わる可能性があります。 [[:punct:]]

R ドキュメント?regexには次のように記載されています。 特定の名前付きクラスの文字が事前定義されています。それらの解釈はロケールによって異なります ( localesを参照)。解釈は POSIX ロケールの解釈です。

punctの Open Group LC_TYPE 定義には、次のように記載されています。

句読点として分類する文字を定義します。

POSIX localeでは、<space>クラス alpha、digit、または cntrl の文字も含まれません。

ロケール定義ファイルでは、キーワード upper、lower、alpha、digit、cntrl、xdigit、または as the に指定された文字は指定されません<space>


ただし、stringi パッケージはICUに依存しているようで、ロケールは ICU の基本的な概念です。

stringi パッケージを使用して、Unicode プロパティ\p{P}\p{S}を使用することをお勧めします。

  • \p{P}あらゆる種類の句読点に一致します。つまり、POSIX クラスpunctに含まれる 9 文字が欠落しています。これは、Unicode が、POSIX が句読点と見なすものを句読点記号の 2 つのカテゴリに分割するためです。ここで\p{S}出番です...

    stri_replace_all_regex(string1, '[\\p{P}\\p{S}]', ' ')
    # [1] "this is a test"            "this  is also a test"     
    # [3] "this is the final  test"   "this is the final   test "
    
  • gsubまたは、これを非常にうまく処理するベース R からフォールバックします。

    gsub('[[:punct:]]', ' ', string1)
    # [1] "this is a test"            "this  is also a test"     
    # [3] "this is the final  test"   "this is the final   test "
    
于 2014-10-13T21:00:27.383 に答える
17

POSIX ライクな正規表現エンジンでは、分類関数punctに対応する文字クラスを表します ( UNIX ライクなシステムで確認してください)。ISO/IEC 9899:1990 (ISO C90) に従って、この関数は、スペースまたは true の文字を除くすべての印刷文字をテストし ます。ただし、POSIX 設定では、どの文字がどのクラスに属するかの詳細は、現在のロケールに依存します。したがって、ここでのクラスは移植可能なコードにはなりません。詳細については、C/POSIX 移行に関する ICU ユーザー ガイドを参照 してください。ispunct()man 3 ispunctispunct()isalnum()punct

一方、stringi が依存し、Unicode 標準に完全に準拠している ICU ライブラリは、いくつかの charclasses を独自の方法で定義していますが、明確に定義されており、常に移植可能です。

特に、Unicode 標準によれば、PLUS SIGN( U+002B) はSymbol, Math ( Sm) カテゴリです (( ) ではありませんPuctuation Mark) P

library("stringi")
ascii <- stri_enc_fromutf32(1:127)
stri_extract_all_regex(ascii, "[[:punct:]]")[[1]]
##  [1] "!"  "\"" "#"  "%"  "&"  "'"  "("  ")"  "*"  ","  "-"  "."  "/"  ":"  ";"  "?"  "@"  "["  "\\" "]"  "_"  "{"  "}" 
stri_extract_all_regex(ascii, "[[:symbol:]]")[[1]]
## [1] "$" "+" "<" "=" ">" "^" "`" "|" "~"

[[:punct:][:symbol:]]したがって、ここでは、 、[[:punct:]+]、またはさらに良い[\\p{P}\\p{S}]or などの文字セットを使用する必要があります[\\p{P}+]

使用可能な文字クラスの詳細については、 を確認してください ?"stringi-search-charclass"。特に、 UnicodeSet およびUnicode Standard Annex #44: Unicode character databaseに関する ICU ユーザー ガイド は、あなたの興味を引くかもしれません。HTH

于 2014-10-14T09:18:46.440 に答える