我得到了一组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&Local Planning for Sustainable Development. Contribute&mail:aprc.rio20@undp.org
为什么我使用{1,15}得到超过15个字符的结果?
答案 0 :(得分:1)
原来是一个编码问题。我无法使用正则表达式来解决这个问题,但我用来检索推文的软件有一个列,表示用户ID推文的推文。所以我会用它来做分析。
答案 1 :(得分:0)
您的grep
命令与以 1-15个字母数字字符开头的任何内容匹配。例如:
@blahblahblahblahblahblahblahblahblah
将匹配,因为grep查找行的开头,查找@,找到至少一个字母字符,然后愉快地停止,考虑到这是一个成功的匹配。 grep并不关心字符串中的模式之后的内容,只要它找到匹配的某事。
为了只获得15个字符以下的内容,您还必须指定下一步:
dmtext <- grep("^@[a-z0-9_]{1,15}\\b", ...
这匹配1-15个字符,后跟一个单词边界(\b
,带有一个额外的字符串转义反斜杠)。因此,它不会匹配长度为16或100个字符的单词 - 只有1到15个字符的单词。