哈希标签正则表达式,保持#in url

时间:2014-08-02 15:09:35

标签: regex r

我想使用R的正则表达式从推文中提取哈希标签(我想将其保留在基础R中,但是其他解决方案对于未来搜索者的答案的稳健性是受欢迎的。)

我有一个正则表达式,我认为会删除哈希标记,但是在下面的MWE中演示时,在网址中有#的时候找到了一个例子。 如何删除文本中的哈希标记,但将#保留在网址中?

这是一个MWE和我尝试过的代码:

text.var <- c("Slides from great talk: @ramnath_vaidya: Interactive slides from Interactive Visualization", 
    "presentation #user2014. http://ramnathv.github.io/user2014-rcharts/#1")

gsub("#\\w+", "", text.var)
gsub("#\\S+", "", text.var)

所需的输出是:

[1] "Slides from great talk: @ramnath_vaidya: Interactive slides from Interactive Visualization"
[2] "presentation . http://ramnathv.github.io/user2014-rcharts/#1"

注意 R的正则表达式与其他正则表达式类似但是特定于R。这个问题特定于R的正则表达式而不是一般的正则表达式问题。

1 个答案:

答案 0 :(得分:6)

嗯,对于特定的情况,您可以使用Negative Lookbehind断言。

gsub('(?<!/)#\\w+', '', text.var, perl=T)
# [1] "Slides from great talk: @ramnath_vaidya: Interactive slides from Interactive Visualization"
# [2] "presentation . http://ramnathv.github.io/user2014-rcharts/#1" 

或者你可以使用PCRE提供的一些黑暗魔法:

gsub('http://\\S+(*SKIP)(*F)|#\\w+', '', text.var, perl=T)
# [1] "Slides from great talk: @ramnath_vaidya: Interactive slides from Interactive Visualization"
# [2] "presentation . http://ramnathv.github.io/user2014-rcharts/#1"    

这里的想法是跳过任何以http://开头的网址,如果需要,可以调整。

在交替运算符的左侧,我们匹配一个url ,使子模式失败,强制正则表达式引擎不使用回溯控制重试子字符串跳转到字符串中的下一个位置。交替运算符的右侧符合我们想要的......