2

我有一些字符串实际上是用于创建表格的 HTML 代码,例如

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

所以我想提取字符串中以 first 开头<TABLE和结尾的部分"<TR"

我能做的最好的就是使用stringi包中的函数

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

输出

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

但它仍然不是我所说的。在 first 之前,字符串的唯一强制性部分"<TR""<TABLE"一些设置,标题和标题是可选的。以及如何为它创建适当的正则表达式的想法?


<TABLE\b[^>]+>[\s\S]+?<TR

试试这个。看演示。

http://regex101.com/r/vF0kU2/7

4

2 回答 2

4
<TABLE\b[^>]+>[\s\S]+?<TR

试试这个。看演示。

http://regex101.com/r/vF0kU2/7

于 2014-12-01T17:42:57.647 回答
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 包rvest代替。

于 2014-12-01T19:37:35.063 回答