提问者:小点点

删除标点符号,但保留R文本中的连字符短语


有没有什么有效的方法可以去除文本中的标点符号,但保留断字表达式,例如“容易发生事故”?

我使用以下功能来清除我的文本

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"

我引用了这个线程,但没有发现它对我的情况有效。一定有一些正则表达式的东西我还没有弄清楚。如果有人能在这方面启发我,我将不胜感激。


共2个答案

匿名用户

把我的两分钱放进去,你可以使用(*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"

查看regex101.com.演示

(?<![^\\w])[- ](?=\\w)
# a whitespace or a dash between two word characters
# or at the very beginning of the string

让这些失败与(*SKIP)(*FAIL)并把你想要删除的东西放在右边的交替,在这种情况下

\W+

有效地删除任何非单词字符,而不是单词字符之间的字符
不过,您需要提供更多的测试示例。

匿名用户

:punct:字符集包括破折号,您将删除它们。您可以创建一个省略破折号的替代字符类。您确实需要特别注意方括号的位置,并避开双引号和反斜杠:

 (test <- gsub("[]!\"#$%&'()*+,./:;<=>?@[\\^_`{|}~]", "", "my-test of #$%^&*") )
[1] "my-test of "

?regex(帮助页)建议不要使用范围。我调查了是否可以使用我当地的ASCII标点符号序列进行简化,但很快就发现,由于其他原因,这不是一种可行的方法。有5个不同的范围,而“”是在其中的一个中间,所以除了需要“先”的“”之外,还有7个范围来处理。