我想删除除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++ "
答案 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
才有效。