在r中提取彼此相邻的两个标签

时间:2019-07-03 16:07:47

标签: r regex stringr

我正在分析Twitter数据,并希望提取推文中的所有主题标签。我曾经像这样提取主题标签:

tweet = 'I like #apple #orange'
str_extract_all(tweet,"#\\S+")

这在大多数情况下都有效。但是有时两个标签彼此相邻。

tweet = 'I like #apple#orange'
str_extract_all(tweet,"#\\S+")

这是我得到的:

[[1]]
[1] "#apple#orange" 

有人知道当标签分开或彼此相邻时,如何正确提取标签吗?

3 个答案:

答案 0 :(得分:4)

您正在与\S过度匹配,因为这将匹配一个非空格字符和一个#

您可以使用negated character类来匹配空白字符,也不能匹配#

#[^#\\s]+

您的代码可能看起来像

tweet = 'I like #apple#orange'
str_extract_all(tweet,"#[^#\\s]+")

结果

[[1]]
[1] "#apple"  "#orange

R demo

答案 1 :(得分:2)

我的猜测是,这个简单的表达式可能会起作用:

#([^#\s]+)

,其中不包括空格和前#之后的#

Demo

答案 2 :(得分:2)

另一种(可能不太简洁)base的可能性:

gsub("([a-z](?=#))(#\\w)","\\1 \\2",
     strsplit(tweet," (?=#+)",perl = TRUE)[[1]][2], perl=TRUE)
[1] "#apple #orange"

如果您需要将它们分开:

 strsplit(gsub("([a-z](?=#))(#\\w)","\\1 \\2",
      strsplit(tweet," (?=#+)",perl = TRUE)[[1]][2], perl=TRUE),
      " ")
[[1]]
[1] "#apple"  "#orange"