2014-12-01 57 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