是否有任何有效的方法可以删除文本中的标点符号,但保留带有连字符的表达式,例如“容易发生事故”?
我使用以下功能来清理文本
clean.text = function(x)
{
# remove rt
x = gsub("rt ", "", x)
# remove at
x = gsub("@\\w+", "", x)
x = gsub("[[:punct:]]", "", x)
x = gsub("[[:digit:]]", "", x)
# remove http
x = gsub("http\\w+", "", x)
x = gsub("[ |\t]{2,}", "", x)
x = gsub("^ ", "", x)
x = gsub(" $", "", x)
x = str_replace_all(x, "[^[:alnum:][:space:]'-]", " ")
#return(x)
}
并将其应用于返回的带连字符的表达式
my_text <- "accident-prone"
new_text <- clean.text(text)
new_text
[1] "accidentprone"
虽然我想要的输出是
"accident-prone"
我引用了this thread,但没有发现它适用于我的情况。必须有一些我还没想到的正则表达式。如果有人能在这方面给我启发,我们将非常感激。
答案 0 :(得分:1)
:punct:
字符集包括短划线,您将删除它们。您可以创建一个省略破折号的备用角色类。您需要特别注意方括号位置并转义双引号和反斜杠:
(test <- gsub("[]!\"#$%&'()*+,./:;<=>?@[\\^_`{|}~]", "", "my-test of #$%^&*") )
[1] "my-test of "
?regex
(帮助页面)建议不要使用范围。我调查了是否可能使用我的本地ASCII标点符号进行任何简化,但很快就显而易见,这不是出于其他原因的方法。有5个单独的范围,&#34;]&#34;在其中一个中间,除了&#34;]&#34;之外还有7个范围可以处理。这需要先来。
答案 1 :(得分:0)
加入我的两分钱,你可以(*SKIP)(*FAIL)
使用perl = TRUE
并删除所有非字字符:
data <- c("my-test of #$%^&*", "accident-prone")
(gsub("(?<![^\\w])[- ](?=\\w)(*SKIP)(*FAIL)|\\W+", "", data, perl = TRUE))
导致
[1] "my-test of" "accident-prone"
<小时/>
这里的想法是匹配你想要保留的内容
(?<![^\\w])[- ](?=\\w)
# a whitespace or a dash between two word characters
# or at the very beginning of the string
让这些在(*SKIP)(*FAIL)
失败,并将您要删除的内容放在替换的右侧,在这种情况下
\W+
有效删除不在单词字符之间的任何非单词字符 您需要提供更多测试示例。