2016-09-26 174 views
2

正则表达式从字符串中提取R中

string = <td class=\"title\"><a href=\"/title/tt0075669/\">Amar Akbar Anthony</a><div class=\"desc_preview\" title=\"10/10&#10;votes 2\"> </div>\n</td> 

我使用的代码

library(stringr) 
str_extract(string,"[A-Z]\\w+") 

对于这个我得到的结果

> str_extract(string,"[A-Z]\\w+") 
[1] "Amar" 

但是我想“的字符串阿马尔阿克巴安东尼“作为我的输出。我应该如何改变我的正则表达式呢?

+3

添加一个空格 - ' “[A-Z] [\\ W \\ S] +”' –

+1

这是我想要的到底是什么 –

回答

1

请注意,您的正则表达式不允许有空格。其添加为[\\w\\s]

"[A-Z][\\w\\s]+" 

另外,如果你的字符串总是在以上格式,你甚至都不需要stringr库,使用基础R gsub

s <- "<td class=\"title\"><a href=\"/title/tt0075669/\">Amar Akbar Anthony</a><div class=\"desc_preview\" title=\"10/10&#10;votes 2\"> </div>\n</td>" 
trimws(gsub("<[^>]+>","",s)) 
[1] "Amar Akbar Anthony" 

this online demogsub("<[^>]+>","",s)将删除所有打开/关闭/等。标签。

或者使用XML解析库抢a标签值:

> library("XML") 
> s <- "<td class=\"title\"><a href=\"/title/tt0075669/\">Amar Akbar Anthony</a><div class=\"desc_preview\" title=\"10/10&#10;votes 2\"> </div>\n</td>" 
> parsed_doc = htmlParse(s, useInternalNodes = TRUE) 
> res <- getNodeSet(doc = parsed_doc, path = "//a/text()") 
> plain_text <- sapply(res, xmlValue) 
> plain_text 
[1] "Amar Akbar Anthony" 
5

编辑:哎呀!我误解了你的问题。我通常从两个HTML标签之间提取东西的方式是在“>”上使用正向倒序,然后读取所有内容,直到下一个“<”。

string = "<td class=\"title\"><a href=\"/title/tt0075669/\">Amar Akbar Anthony</a><div class=\"desc_preview\" title=\"10/10&#10;votes 2\"> </div>\n</td>" 

str_extract(string,"(?<=>)[^<]+") 

这有点脆弱。更好的答案是你不使用正则表达式来解析HTML。 (htmlTreeParse()XML library是一种方法;该httr package也有这样的功能。)

我原来的答案,提取所有单词作为一个列表:

开关从str_extract()str_extract_all()

str_extract(string,"[A-Z]\\w+") 
[1] "Amar" 

str_extract_all(string,"[A-Z]\\w+") 
[[1]] 
[1] "Amar" "Akbar" "Anthony" 
相关问题