Подтвердить что ты не робот

Удалите все знаки препинания, кроме апострофов в R

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

Пример:

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

Токовый выход (нет апострофа, нет)

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

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

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

Ответ 1

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

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

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

Ответ 2

Вот пример:

>  gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x)
[1] "I like to chew gum but don't like bubble gum"

Ответ 3

В основном для разнообразия, вот решение, использующее 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:]$|^]". Спасибо Г. Гротендику за указание этой детали.)

Ответ 4

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

[^'[:^punct:]]

Код:

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

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

демонстрация ideone