如何在XML中使用正则表达式从列表

时间:2016-03-03 02:28:33

标签: regex xml r xml-parsing

我刚刚开始在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 个答案:

答案 0 :(得分: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位数字。

或者,您也可以使用匹配str_match +空格+ {12}整数字的Product ID:Product ID:\s*(\d{12})\b regex来提取这些ID(因此,我们需要使用str_match而不是str_extract):

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