2014-12-01 56 views
2

所有表达式我有一些字符串,它实际上是HTML代码来创建表,例如如何找到结束“<TR”(stringi包)

z <- "<TABLE ALIGN=\"RIGHT\" BORDER CELLSPACING=\"0\" CELLPADDING=\"0\"> 
    <CAPTION><B>MESA HIGH VICTORIES</B></CAPTION> 
    <TH>Team</TH> 
    <TH>Score</TH> 
    <TR ALIGN=\"CENTER\"> 
    <TD><B>Parkfield High Demons</B></TD> 
    <TD><B>28 to 21</B></TD> 
    </TR> 
    <TR ALIGN=\"CENTER\"> 
    <TD><B>Burns High Badgers</B></TD> 
    <TD><B>14 to 13</B></TD> 
    </TR> 
    </TABLE>" 

我想提取表达

<TABLE ALIGN=\"RIGHT\" BORDER CELLSPACING=\"0\" CELLPADDING=\"0\"> <CAPTION><B>MESA HIGH VICTORIES</B></CAPTION> <TH>Team</TH> <TH>Score</TH> <TR

所以我想提取与<TABLE开始并以第一"<TR"

最好的结束串的片段我可以做的是使用功能从stringi

stri_extract_all_regex(z, "(?i)\\<table.*?\\>(\\s+)?(\\<caption,*? \\>)?")

输出

[[1]] [1] "<TABLE ALIGN=\"RIGHT\" BORDER CELLSPACING=\"0\" CELLPADDING=\"0\">\n "

但它毕竟不是我换货。在第一个"<TR"之前,字符串唯一的强制性部分是"<TABLE",其中有一些设置,字幕和标题是可选的。和想法如何为它创建适当的正则表达式?

回答

3

使用rex可能使这种类型的任务更简单一点的。

z <- "<TABLE ALIGN=\"RIGHT\" BORDER CELLSPACING=\"0\" CELLPADDING=\"0\"> 
    <CAPTION><B>MESA HIGH VICTORIES</B></CAPTION> 
    <TH>Team</TH> 
    <TH>Score</TH> 
    <TR ALIGN=\"CENTER\"> 
    <TD><B>Parkfield High Demons</B></TD> 
    <TD><B>28 to 21</B></TD> 
    </TR> 
    <TR ALIGN=\"CENTER\"> 
    <TD><B>Burns High Badgers</B></TD> 
    <TD><B>14 to 13</B></TD> 
    </TR> 
    </TABLE>" 

library(rex) 
re_matches(z, 
    rex(
    capture(name='table', 
     "<TABLE", zero_or_more(any, type = 'lazy'), "<TR" 
    ) 
), options='single-line') 

但是,我不会建议使用正则表达式解析HTML。您可能需要考虑使用XML packagervest