从 R 中的推特状态中提取用户。非平凡的情况,如 RT@user @user:
Extracting users from twitter status in R. Non-trivial cases like RT@user @user:
我想从推文中提取用户名,这些用户名可能是:
- 后跟一些非字母数字字符。
- 前面没有白色 space。
例如,从这个:
"RT@user1: This is a retweet that mentions @user2."
我想要一个像这样的向量
[1] @user1 @user2
(带或不带“@”)
这是我当前的脚本:
text <- "RT@user1: This is a retweet that mentions @user2."
tokens <- unlist(strsplit(text, " "))
mentions.mask <- grepl("@\w+", tokens)
mentions <- tokens[mentions.mask]
cat(mentions)
[1] "RT@user1:" "@user2."
我怎样才能正确地做到这一点?
如果我理解得很好,这似乎很简单,您的正则表达式只是缺少捕获组。您可以使用此正则表达式:
(@\w+)
^----^--- Note capturing groups
在 R 中你可以使用:
library(stringr)
str_extract("RT@user1: This is a retweet that mentions @user2.", "@\w+")
为此您可以简单地坚持使用基数 R。
text <- "RT@user1: This is a retweet that mentions @user2."
regmatches(text, gregexpr('@\w+', text))[[1]]
# [1] "@user1" "@user2"
没有前面的@
:
regmatches(text, gregexpr('@\K\w+', text, perl=T))[[1]]
# [1] "user1" "user2"
我想从推文中提取用户名,这些用户名可能是:
- 后跟一些非字母数字字符。
- 前面没有白色 space。
例如,从这个:
"RT@user1: This is a retweet that mentions @user2."
我想要一个像这样的向量
[1] @user1 @user2
(带或不带“@”)
这是我当前的脚本:
text <- "RT@user1: This is a retweet that mentions @user2."
tokens <- unlist(strsplit(text, " "))
mentions.mask <- grepl("@\w+", tokens)
mentions <- tokens[mentions.mask]
cat(mentions)
[1] "RT@user1:" "@user2."
我怎样才能正确地做到这一点?
如果我理解得很好,这似乎很简单,您的正则表达式只是缺少捕获组。您可以使用此正则表达式:
(@\w+)
^----^--- Note capturing groups
在 R 中你可以使用:
library(stringr)
str_extract("RT@user1: This is a retweet that mentions @user2.", "@\w+")
为此您可以简单地坚持使用基数 R。
text <- "RT@user1: This is a retweet that mentions @user2."
regmatches(text, gregexpr('@\w+', text))[[1]]
# [1] "@user1" "@user2"
没有前面的@
:
regmatches(text, gregexpr('@\K\w+', text, perl=T))[[1]]
# [1] "user1" "user2"