3

我正在尝试编写一个从一段文本中删除网站的函数。我有:

removeWebsites<- function(text){
  text = gsub("(http://|https://|www.)[[:alnum:]~!#$%&+-=?,:/;._]*",'',text)
  return(text)
}

这处理了大量的问题,但不是一个流行的问题,即某种形式的问题xyz.com

我不希望.com在上述正则表达式的末尾添加,因为它限制了该正则表达式的范围。但是我尝试编写更多的正则表达式,例如:

gsub("[[:alnum:]~!#$%&+-=?,:/;._]*.com",'',testset[10])

这有效,但它也将表单的电子邮件 ID 修改abc@xyz.comabc@. 我不想要这个,所以我修改为

gsub("*((^@)[[:alnum:]~!#$%&+-=?,:/;._]*).com",'\\1',testset[10])

这留下了电子邮件ID,但停止识别表单的网站xyz.com

我知道我需要在此处进行某种设置差异,即此处解释的形式,我无法实现它(主要是因为我无法完全理解它)。关于我如何解决我的问题的任何想法?

编辑:我尝试了消极的前瞻:

gsub("[[:alnum:]~!#$%&+-=?,:/;._](?!@)[^(?!.*@)]*.com",'',testset[10])

我收到“无效的正则表达式”错误。我相信在纠正方面的一点帮助可能会让这个工作......

4

2 回答 2

1

我不敢相信。实际上有一个简单的解决方案。

gsub(" ([[:alnum:]~!#$%&+-=?,:/;._]+)((.com)|(.net)|(.org)|(.info))",' ',text)

这通过以下方式起作用:

  1. 从一个空格开始。
  2. 放各种东西,除了一个'@'。
  3. 以 .com/net/org/info/ 结尾

请务必考虑打破它!我相信也会有一些案例会打破这一点。

于 2013-01-21T10:28:32.967 回答
0

你的环视对我来说有点有趣:你不能在一个角色类里面看后面,你为什么要向前看?看看后面更合适。我认为以下表达式应该有效,尽管我没有测试它:

gsub("*((?<!@)[[:alnum:]~!#$%&+-=?,:/;._]*).com",'\\1',testset[10])

另请注意,lookbehinds 必须具有固定长度,因此不允许使用乘数

于 2013-01-21T09:57:45.210 回答