2016-03-03 16 views
1

我已經使用XML包中的R剛剛開始列表提取字符串和我有麻煩提取XML列表的字符串:如何使用正則表達式在XML從

> library("XML") 
> library("stringr") 
> url = "html-1.html" 
> parsed_doc = htmlParse(file=url, useInternalNodes = TRUE) 
> products <- getNodeSet(doc = parsed_doc, path = "//li[contains(.,Product ID')]") 
> products 
[[1]] 
<li>&#13; 
         Product ID:&#13; 
         000002434482&#13; 
        </li> 

[[2]] 
<li>&#13; 
         Product ID:&#13; 
         000002183105&#13; 
        </li> 

[[3]] 
<li>&#13; 
         Product ID:&#13; 
         000002183105&#13; 
        </li> 

我想創建一個包含每個ID的向量。我嘗試了一些正則表達式來提取12位數字的產品ID,但似乎無法使其正常工作。

> mrn <- str_extract(products , "[[:digit:]{12}") 
> mrn <- str_extract(products , "[[:digit:]+&#13]") 
> mrn <- str_extract(products , "[0-9]+&#13") 

我想知道列表結構是否與它有關或可能是間距?

我也嘗試了> mrn <- str_extract(products , ".{16}")然而,R返回指針值,如"<pointer: 0x6815" - 我認爲這是接近,但我不知道這是什麼意思。

回答

1

你幾乎在那裏。該節點集不是一個字符串向量,您需要首先從其中獲取字符串值。可以方便地與xmlValue提取它們,然後可以使用str_extract(或str_extract_all):

> v <- sapply(products, xmlValue) 
> v 
[1] "\r\n      Product ID:\r\n      000002434482\r\n"      
[2] "\r\n      Product ID:\r\n      000002183105\r\n"      
[3] "\r\n      Product ID:\r\n      000002183105\r\n     " 
> unlist(str_extract_all(v, "[[:digit:]]+")) 
[1] "000002434482" "000002183105" "000002183105" 

如果ID僅包含12個數字的全字,則可以使用更精確的表達等

"\\b[[:digit:]]{12}\\b" 

其中\b是一個字的邊界,{12}是一個限制性量詞,完全匹配一個數字的12次出現。

另外,您還可以提取這些ID與str_matchProduct ID:\s*(\d{12})\b regex匹配Product ID: +空間(S)+ 12位整字號碼(即捕獲,因此,我們需要使用str_match,而不是str_extract):

> res <- unlist(str_match(v, "Product ID:\\s*(\\d{12})\\b")) 
> res[,2] 
[1] "000002434482" "000002183105" "000002183105"