Удалите все знаки препинания, кроме апострофов в 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"
Ответы
Ответ 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