正则表达式删除包含特殊字符的单词以及R中的url

时间:2014-04-06 02:59:52

标签: regex string r gsub

我想删除除c#/ c ++之外的包含特殊字符的单词。我也想删除句子中的url。

对于Eg,我的输入是:

x <- "Google in the la#d of What c#  chell//oo grr+m my Website is: c++ http://www.url.com/bye"

我正在做的是

gsub("http://(\\S+)|\\s*[\\^w\\s]\\s*[^c#c++\\s]","",x)

我的预期输出是

"Google in the of What c#  my Website c++"

但我得到了

"Google in the la#d of What c#  chell//oo grr+m my Webte i c++ "

2 个答案:

答案 0 :(得分:3)

这个怎么样?它似乎做了伎俩。使用strsplit首先分割字符串似乎更容易一些。下面的一个示例使用grep,另一个使用gsub。它们各自使用不同的正则表达式。此外,grep的参数有时可以非常

> newX <-unlist(strsplit(x, "\\s"))

使用grep

> newX2 <- grep("((^[a-z]{2,3}$)|[A-Z]{1})|(c#|(\\+{2}))", newX, value = TRUE)
> paste(newX2, collapse = " ")
[1] "Google in the of What c# my Website c++"

gsub。这实际上要容易得多......他们的关键思想是确定标点符号在字符中出现的位置。

> paste(gsub("[a-z]{2,3}(:|#)|(\\+|//)[a-z{1}]", "", newX), collapse = " ")
[1] "Google in the of What c#  my Website c++"

答案 1 :(得分:2)

这是一个单一的正则表达式,虽然可怕的丑陋,但是完成了这项任务:

gsub('(?:^|(?<=\\s))(?:(c\\+\\+|c#)|http://[^\\s]*|[^\\s]*[#/:+]+[^\\s]*)(?:\\s|$)', '\\1', x, perl=TRUE)
## [1] "Google in the of What c# my Website c++"

这使用表达式[#/:+]作为“特殊字符”的匹配,而不是c#c++中的字符。

打破这个局面:

首先,必须存在一个空格(但实际上并不匹配),或者它必须是匹配开始的文本的开头:(?:^|(?<=\\s))。该选项显示为具有(?:)的非捕获组。这很重要,因为我们想要在表达式中捕获c#c++(稍后)。

接下来,选择三个选项,|作为分隔符:(?:(c\\+\\+|c#)|http://[^\\s]*|[^\\s]*[#/:+]+[^\\s]*)。这个选择是另一个非捕获组。

前两个选项(实际上是一个选项,但正则表达式匹配的两种可能性)匹配c++c#并使用(c\\+\\+|c#)捕获值。否则,网址表示可能与http://[^\\s]*或具有[^\\s]*[#/:+]+[^\\s]*特殊字符的字词匹配。不捕获具有特殊字符的URL或单词。

最后,必须存在一个空格,或者它必须是字符串的结尾,由(?:\ s | $)指定最终的非捕获组:(?:\\s|$)

然后整个表达式被第一个捕获替换,它可能是空的。如果它是非空的,则捕获将包含字符串c#c++

此表达式需要perl=TRUE才有效。