我有以下HTML,我试图用R中的gregexpr函数运行正则表达式
<div class=g-unit>
<div class=nwp style=display:inline>
<input type=hidden name=cid value="22144">
<input autocomplete=off class=id-fromdate type=text size=10 name=startdate value="Sep 6, 2013"> -
<input autocomplete=off class=id-todate type=text size=10 name=enddate value="Sep 5, 2014">
<input id=hfs type=submit value=Update style="height:1.9em; margin:0 0 0 0.3em;">
</div>
</div>
</div>
<div id=prices class="gf-table-wrapper sfe-break-bottom-16">
<table class="gf-table historical_price">
<tr class=bb>
<th class="bb lm lft">Date
<th class="rgt bb">Open
<th class="rgt bb">High
<th class="rgt bb">Low
<th class="rgt bb">Close
<th class="rgt bb rm">Volume
<tr>
...
...
</table>
</div>
Run Code Online (Sandbox Code Playgroud)
我试图通过使用以下正则表达式从这个HTML中提取表部分
<table\\s+class="gf-table historical_price">.+<
Run Code Online (Sandbox Code Playgroud)
当我使用perl = FALSE运行gregexpr函数时,它工作正常,我得到一个结果但是如果我用perl = TRUE运行它,我什么也得不回来.它似乎不匹配它
有谁知道为什么结果不同于只是打开和关闭Perl?提前谢谢了!
似乎在正则表达式的扩展模式中,点能够匹配换行符,这在perl模式中不是这种情况.要使其在perl模式下工作,您需要使用(?s)修饰符使点也能够匹配换行符:
> m <- gregexpr('(?s)<table\\s+class="gf-table historical_price">.+</table>', str, perl = TRUE)
Run Code Online (Sandbox Code Playgroud)
在许多正则表达式中,默认情况下,点与新行不匹配,可能会使逐行作业变得更加方便.
该s内联修改(?s)代表"单线".换句话说,这意味着即使存在换行符,整个字符串也会被视为单行(对于点).