1

我得到了一组 Twitter 状态更新,我试图过滤后者的所有直接消息、发送者和接收者。我的数据框包括发件人和文本的列。使用正则表达式我正在尝试将接收者从文本列中过滤出来。

这就是我得到的,但它返回了一些奇怪的结果

   WD <- getwd()
   if (!is.null(WD)) setwd(WD)

   load("data.R")
   #http://www.unet.univie.ac.at/~a0406222/data.R

   dmtext <- grep("^@[a-z0-9_]{1,15}", tweets$text, perl=T, value=TRUE,ignore.case=TRUE)
   dm.receiver <- gsub("^@([a-z0-9_]{1,15})[ :,].*$", "\\1", dmtext, perl=T,ignore.case=TRUE)
   dm.sender <- as.character(tweets$from_user[grep("^@[a-z0-9_]{1,15}", tweets$text,       perl=T,ignore.case=TRUE,value=FALSE)])


   dm.df <- data.frame(dm.sender,dm.receiver,dmtext)

   dm.df[1:1000,2]

这些是我为 dm.receiver 得到的坏结果的一些例子

    @insultaofuturo Apesar da proibição, jovens insistem em acampar no Aterro na Rio+20\nhttp://t.co/dCfFHUWV
    @mqtodd Bringing the .green Internet to Rio+20 Summit | DotGreen\nhttp://t.co/pQqYilXp #RioPlus20 #gogreen
    @Shyman33 Elinor Ostrom's trailblazing commons research can inspire Rio+20\n http://t.co/m7OTHBtP
    @OccupyRio20 @pnud_es @FBuenAbad @rioplussocial #Futurewewant \nALGO DE ESTO SE HA CUMPLIDO? http://t.co/QDlVwT5z
    @UNDP_CDG#UNDP#Asia-Pacific#Rio+20E-discussion on National&amp;Local Planning for Sustainable Development. Contribute&amp;mail:aprc.rio20@undp.org

为什么我使用 {1,15} 得到的结果超过 15 个字符?

4

2 回答 2

1

原来是编码问题。我无法使用正则表达式解决这个问题,但我用来检索推文的软件有一个列,该列指示用户 id 推文的地址。所以我会用它来做分析。

于 2012-10-09T21:08:09.580 回答
0

您的命令匹配以 1-15 个字母数字字符开头的grep任何内容。例如:

@blahblahblahblahblahblahblahblahblah

将匹配,因为 grep 查找行首,查找 @,找到至少一个字母字符,然后愉快地停止,认为这是一个成功的匹配。grep 不关心字符串中模式之后的内容,只要它找到匹配的内容即可。

为了只获取 15 个字符以下的内容,您还必须指定接下来的内容:

dmtext <- grep("^@[a-z0-9_]{1,15}\\b", ...

这匹配 1-15 个字符,后跟单词边界 ( \b,带有用于字符串转义的额外反斜杠)。因此,它不会匹配长度为 16 或 100 个字符的单词——仅匹配 1 到 15 个字符的单词。

于 2012-10-09T12:29:28.180 回答