Удалить все знаки препинания, кроме апострофов в R - PullRequest
29 голосов
/ 02 января 2012

Я бы хотел использовать gsub R для удаления всех знаков препинания из текста, кроме апострофов. Я довольно плохо знаком с регулярным выражением, но учусь.

Пример:

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

Токовый выход (без апострофа) * ​​1009 *

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

Желаемый результат (я хочу, чтобы апостроф не остался)

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

Ответы [ 4 ]

36 голосов
/ 02 января 2012
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"

Вышеупомянутое регулярное выражение гораздо более прямолинейно. Он заменяет все, что не является буквенно-цифровыми знаками, пробелом или апострофом (символ каретки!), Пустой строкой.

7 голосов
/ 02 января 2012

Вот пример:

>  gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x)
[1] "I like to chew gum but don't like bubble gum"
5 голосов
/ 02 января 2012

В основном для разнообразия, вот решение, использующее 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 по умолчанию. Его правила для сопоставления регулярных выражений немного отличаются: например, если бы он использовался для обработки приведенной выше строки, нужно было бы вместо этого set pattern = "[[:punct:]$|^]". Спасибо G. Grothendieck за указание на эту деталь.)

4 голосов
/ 11 октября 2015

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

[^'[:^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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...