Извлечение пользователей из статуса твиттера в R. Нетривиальные случаи типа RT@user @user:

Я хочу извлечь имена пользователей из твита, где эти имена пользователей могут быть:

  • за которыми следуют некоторые не буквенно-цифровые символы.
  • без пробела перед ним.

Например, отсюда:

"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."

Как я могу сделать это правильно?


person alberto    schedule 27.06.2015    source источник
comment
Можете ли вы указать пример ввода и ожидаемый результат?   -  person Federico Piazza    schedule 27.06.2015
comment
@Fede пример ввода будет переменной text, а вывод - вектором, содержащим @user1 и @user2 Разве это не ясно в моем вопросе?   -  person alberto    schedule 27.06.2015
comment
Я отредактировал на всякий случай.   -  person alberto    schedule 27.06.2015
comment
теперь ясно. Я не вижу ничего плохого, кроме отсутствия групп захвата   -  person Federico Piazza    schedule 27.06.2015


Ответы (2)


Если я правильно понял, это кажется довольно простым, и в вашем регулярном выражении просто отсутствуют группы захвата. Вы можете использовать это регулярное выражение:

(@\w+)
^----^--- Note capturing groups

Рабочая демонстрация

В R вы можете использовать:

library(stringr)
str_extract("RT@user1: This is a retweet that mentions @user2.", "@\\w+")
person Federico Piazza    schedule 27.06.2015
comment
Спасибо @Fede. Дело в том, как применить это к R. Регулярные выражения кажутся немного другими. Например, что-то вроде grep("@\\w+", text, value=TRUE) только определяет, был ли шаблон найден. - person alberto; 27.06.2015
comment
Идеально сейчас! Просто обратите внимание, что это должно быть str_extract_all, чтобы получить все совпадения - person alberto; 27.06.2015
comment
@alberto отлично, спасибо. Рад помочь - person Federico Piazza; 28.06.2015

Вы можете просто придерживаться базы 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"
person hwnd    schedule 27.06.2015