31

R の gsub を使用して、アポストロフィを除くすべての句読点をテキストから削除したいと思います。私は正規表現にかなり慣れていませんが、学んでいます。

例:

x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[[:punct:]]", "", as.character(x))

現在の出力 (don't にアポストロフィなし)

[1] "I like to chew gum but dont like bubble gum"

希望する出力 (アポストロフィーはそのままにしておきたい)

[1] "I like to chew gum but don't like bubble gum"
4

4 に答える 4

42
x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[^[:alnum:][:space:]']", "", x)

[1] "I like to chew gum but don't like bubble gum"

上記の正規表現ははるかに簡単です。英数字記号、スペース、またはアポストロフィ(カレット記号!)以外のすべてを空の文字列に置き換えます。

于 2012-01-02T07:18:55.610 に答える
8

punct二重否定を使用して、POSIX クラスからアポストロフィを除外できます。

[^'[:^punct:]]

コード:

x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?"
gsub("[^'[:^punct:]]", "", x, perl=T)

#[1] "I like to chew gum but don't like bubble gum"

ideone demo

于 2015-10-11T05:07:11.763 に答える
7

次に例を示します。

>  gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x)
[1] "I like to chew gum but don't like bubble gum"
于 2012-01-02T03:32:36.053 に答える
5

主にバラエティのためgsubfn()に、同じ名前の素晴らしいパッケージから使用するソリューションがあります。このアプリケーションでは、私はそれが可能にするソリューションがどれほどうまく表現できるかが好きです:

library(gsubfn)
gsubfn(pattern = "[[:punct:]]", engine = "R",
       replacement = function(x) ifelse(x == "'", "'", ""), 
       x)
[1] "I like to chew gum but don't like bubble gum"

(引数engine = "R"が必要なのは、そうでない場合はデフォルトのtclエンジンが使用されるためです。正規表現を照合するためのルールは少し異なります。たとえば、上記の文字列を処理するために使用した場合は、代わりに設定する必要がありますpattern = "[[:punct:]$|^]"。Gに感謝します。その詳細を指摘してくれたグロタンディーク。)

于 2012-01-02T05:45:15.600 に答える