用R中的字长以不同的方式替换字符串中的标点符号

时间:2017-09-24 19:59:28

标签: r regex stringr

我有一个包含大量(冗长)字符串的data.frame。在处理它们之前,我试图将它们清理一下,但是在处理句点时我遇到了一个问题。我希望能够区分何时使用句号来结束句子以及何时将其用作缩写的一部分。我想通过长度来做这件事,但还没有想出正确的正则表达式。

说我有这样的字符串:mystring <- "hello.world from the u.s.a."。我想用"hello world from the usa"之类的内容替换它。

我可以尝试使用split_string <- unlist(strsplit(mystring, split=" "))按空格分割data.frame,然后运行类似

的内容

split_string <- ifelse(nchar(split_string) < 7, gsub(".", "", split_string), gsub(".", " ", split_string))

但由于文本的主体相当大,这是一个非常缓慢(而且相当丑陋)的过程。我怎么能以更有效和更清洁的方式做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以对此进行测试,看看这是否更快。它查找分隔符,最多6个非空格字符和分隔符,对于任何此类匹配,它运行在gsubfn的第二个参数中的公式表示法中指定的匿名函数。该匿名函数删除匹配中的任何句点。在剩下的内容中,gsub用空格替换每个句点。

library(gsubfn)
pat <- "(?<=^| )(\\S{1,6})(?=$| )"
gsub("[.]", " ", gsubfn(pat, ~ gsub("[.]", "", ..1), mystring, perl = TRUE))
## [1] "hello world from the usa"

答案 1 :(得分:2)

以下内容......

mystring2 <- gsub("(\\w)\\.(\\w)","\\1 \\2",gsub("\\.(\\w+)\\.","\\1",mystring))

mystring2
[1] "hello world from the usa."

对于字母两边的点,它首先删除它们,然后对于带有字母两边的剩余点,它用空格替换它们。

它甚至会将示例中的最后一个点保留为句子的结尾!