R и регулярное выражение: извлечение имени источника из новостей - PullRequest
1 голос
/ 13 октября 2011

У меня есть новости от R, например:

> 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, - Интерфакс Россия, - Ura.ru и др.)
Я пытаюсь это library(stringr):

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:

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

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Попробуйте использовать strsplit, но я отмечаю, что ваш разделитель на самом деле представляет собой два разных типа тире:

strsplit(mydf$title, split=" [–-] ", useBytes=TRUE)

Это даст вам список элементов.(Как видите, я не смог получить правильную кодировку на своей машине, но даже в этом случае ясно, что информационное агентство всегда является последним элементом каждого списка. Единственная другая проблема, с которой вам придется иметь делов этом случае источник может также включать тире. Если это произойдет, вам придется использовать вставку, чтобы объединить все элементы, кроме последнего, в каждом списке.

[[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"   
0 голосов
/ 13 октября 2011

Возможно, вы слишком усложняете вещи:

strsplit(c("before - after", "123 - 456"), " - ", fixed=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...