正则表达式帮助:识别文本中的网站

时间:2013-01-21 08:56:16

标签: regex

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

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

这处理了一大堆问题,但不是一个受欢迎的问题,即xyz.com

形式的问题

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

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

这很有用,但它也修改了abc@xyz.com格式的电子邮件ID到abc@。我不想要这个,所以我把它修改为

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

仅留下电子邮件ID,但停止识别xyz.com

形式的网站

我明白我需要某种形式上的区别,这是我所解释的形式here,但我无法实现它(主要是因为我无法完全理解它)。关于如何解决我的问题的任何想法?

编辑:我尝试过负面的前瞻:

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

我收到了“无效的正则表达式”错误。我相信在纠正方面有一些帮助可以使这个工作......

2 个答案:

答案 0 :(得分:1)

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

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

这适用于:

  1. 以空格开头。
  2. 放入各种各样的东西,除了'@'in。
  3. 以.com / net / org / info /
  4. 结尾

    请注意打破它!我相信会有一些案例也会破坏这一点。

答案 1 :(得分:0)

你的外表看起来对我来说有点滑稽:你不能在一个角色课里面看,你为什么要向前看?看起来更合适了。 我认为以下表达式应该工作,虽然我没有测试它:

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

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