首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R和regexp:从新闻中提取名称来源

R和regexp:从新闻中提取名称来源
EN

Stack Overflow用户
提问于 2011-10-13 13:37:30
回答 2查看 228关注 0票数 1

我有一个来自R的报废新闻,如下所示:

代码语言:javascript
复制
> View(mydf$title)
<name of the news> <dash> <source name>    
Матч КХЛ перенесен на 2 дня - Газета.Ru
Всероссийская универсиада 2010 - Interfax Russia
Звезда хоккея снялся в клипе популярного рэпера. ВИДЕО - Ura.ru
Трактор – Тролейбус 2:1 14.04.2011 – YouTube

我需要在标题新闻和消息来源名称上拆分mydf$title (-Газета.ru,- Interfax mydf$title,- Ura.ru等)

我试一下这个library(stringr)

代码语言:javascript
复制
mydf$sourse <- str_extract(mydf$title, '\\- [A-Za-zА-Яа-я0-9." ]{0,}$')
mydf$sourse <- str_extract(mydf$title, "\\-[:space:[:alpha:][:punct:][:space:]]{0,}$")
mydf$sourse <- str_extract(mydf$title, '\\-\\s[A-Za-zА-Яа-я0-9[:punct:]\\s]{0,}')
mydf$sourse <- str_extract(mydf$title, "\\s-\\s[\\w+\\s.]{0,}$")
mydf$sourse <- str_extract(mydf$title, "\\s-\\s[:alpha:][:print:]$")

但效果不是很好。如何以最佳方式拆分字符串?谢谢你的建议。Спасибо。

注:mydf为data.frame:

代码语言:javascript
复制
> str(mydf)
'data.frame':   100 obs. of  6 variables:
 $ title      : Factor w/ 100 levels...
 $ link       : Factor w/ 100 levels...
 $ guid.text  : Factor w/ 100 levels...
 $ guid..attrs: Factor w/ 1 level...
 $ pubDate    : Factor w/ 100 levels...
 $ description: Factor w/ 100 levels...
EN

回答 2

Stack Overflow用户

发布于 2011-10-13 15:08:59

尝试使用strsplit,但我注意到您的分隔符实际上是两种不同类型的破折号:

代码语言:javascript
复制
strsplit(mydf$title, split=" [–-] ", useBytes=TRUE)

这将为您提供一个元素列表。(如您所见,我无法在我的机器上获得正确的编码,但即便如此,很明显,通讯社始终是每个列表的最后一个元素。然后,您必须处理的唯一另一个问题是,有时源代码也可能包含破折号。如果发生这种情况,您将不得不使用粘贴来组合每个列表中除最后一个元素之外的所有元素。

代码语言:javascript
复制
[[1]]
[1] "<U+041C><U+0430><U+0442><U+0447> <U+041A><U+0425><U+041B> <U+043F><U+0435><U+0440><U+0435><U+043D><U+0435><U+0441><U+0435><U+043D> <U+043D><U+0430> 2 <U+0434><U+043D><U+044F>"
[2] "<U+0413><U+0430><U+0437><U+0435><U+0442><U+0430>.Ru"                                                                                                                           

[[2]]
[1] "<U+0412><U+0441><U+0435><U+0440><U+043E><U+0441><U+0441><U+0438><U+0439><U+0441><U+043A><U+0430><U+044F> <U+0443><U+043D><U+0438><U+0432><U+0435><U+0440><U+0441><U+0438><U+0430><U+0434><U+0430> 2010"
[2] "Interfax Russia"                                                                                                                                                                                       

[[3]]
[1] "<U+0417><U+0432><U+0435><U+0437><U+0434><U+0430> <U+0445><U+043E><U+043A><U+043A><U+0435><U+044F> <U+0441><U+043D><U+044F><U+043B><U+0441><U+044F> <U+0432> <U+043A><U+043B><U+0438><U+043F><U+0435> <U+043F><U+043E><U+043F><U+0443><U+043B><U+044F><U+0440><U+043D><U+043E><U+0433><U+043E> <U+0440><U+044D><U+043F><U+0435><U+0440><U+0430>. <U+0412><U+0418><U+0414><U+0415><U+041E>"
[2] "Ura.ru"                                                                                                                                                                                                                                                                                                                                                                                  

[[4]]
[1] "<U+0422><U+0440><U+0430><U+043A><U+0442><U+043E><U+0440>"                               
[2] "<U+0422><U+0440><U+043E><U+043B><U+0435><U+0439><U+0431><U+0443><U+0441> 2:1 14.04.2011"
[3] "YouTube"   
票数 1
EN

Stack Overflow用户

发布于 2011-10-13 15:10:09

也许你把事情搞得过于复杂了:

代码语言:javascript
复制
strsplit(c("before - after", "123 - 456"), " - ", fixed=TRUE)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7750164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档