【问题标题】:How to extract a string that both matches some pattern and rests between two other strings如何提取既匹配某个模式又位于其他两个字符串之间的字符串
【发布时间】:2013-07-21 17:35:44
【问题描述】:

对不起,如果这是重复的..我不清楚 SO 上已有的内容如何执行此特定任务..

我的目标是在一些 html 代码中找到压缩文件的文件名。文件名位于<a href=...> html 块内,因此很容易被人类找到。

这里有一些代码可以重现我正在查看的内容:

# character vector with two strings from my html file
string.examples <-
    c("ANES Time Series Cumulative Data File</b><br /><a href=\"../cdf/cdf.htm\"> Study Page</a>&nbsp; | &nbsp;<a href=\"../cdf/cdf_errata.htm\">Errata</a>&nbsp; | &nbsp;<a href=\"../data/cdf/anes_cdf.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-ascii']);\">Download ascii data files  <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/cdf/anes_cdfpor.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-por']);\">Download .por file  <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/cdf/anes_cdfdta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-dta']);\">Download .dta file <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;August 25, 2011 version </td></tr>", 
    "ANES 2012 Time Series Study</b><br /><a href=\"../anes_timeseries_2012/anes_timeseries_2012.htm\">Study Page</a>&nbsp; | &nbsp;<a href=\"../anes_timeseries_2012/anes_timeseries_2012_errata.htm\">Errata</a>&nbsp; |  &nbsp;<a href=\"../data/anes_timeseries_2012/anes2012TS.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-ascii']);\">Download ascii data files <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/anes_timeseries_2012/anes2012TS_sav.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-sav']);\">Download .sav file</a> <a href=\"../data/anes_timeseries_2012/anes2012TS_sav.zip\"><img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/anes_timeseries_2012/anes2012TS_dta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-dta']);\">Download .dta file <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;July 1, 2013 version<br />"
)

深埋在第一行,有文字&lt;a href=\"../data/cdf/anes_cdfdta.zip\",在第二行,有文字&lt;a href=\"../data/anes_timeseries_2012/anes2012TS_dta.zip\"

从这两行中,我想提取../data/cdf/anes_cdfdta.zip../data/anes_timeseries_2012/anes2012TS_dta.zip,因为它们包含文本dta.zip,并且因为它们&lt;a href=\" 开始,然后以\" 结束

我想要一些东西:

x <- some.regex.function( string.examples )

产生一个长度为 2 的字符向量 ...

> x
[1] "../data/cdf/anes_cdfdta.zip"                     "../data/anes_timeseries_2012/anes2012TS_dta.zip"

【问题讨论】:

  • 所有文件都有共同的 dta.zip?
  • gsub("(.*a href=\\\")(.*dta\\.zip)(.*)$", "\\2", string.examples)?
  • @Arun dammit 我的正则表达式太糟糕了..你能把它作为答案,我会把它标记为正确的吗?谢谢!!!!!!!!!!!!!!!
  • @LefterisBab 是的。阿伦解决了它

标签: regex r gsub


【解决方案1】:

这里我假设您要查找的模式在a href=\" 之后开始并以dta.zip 结束。所以想法是使用贪婪搜索来遍历所有a href,直到dta.zip。此外,我们捕获每个部分并将搜索到的字符串替换为所需的捕获。

gsub("(.*a href=\\\")(.*dta\\.zip)(.*)$", "\\2", string.examples)

前面提到的.*a href=\\\"“贪婪”搜索模式(必须转义\和“)。然后通过执行.*data\\.zip,我们限制贪婪搜索不超出我们需要的点。还有这个是我们感兴趣的模式。所以,我们确保也捕获它。然后剩下的就很明显了。替换模式是第二个捕获。

【讨论】:

  • 谢谢安东尼。如果您希望有a onmouseover href 和其他变体,您可以将a href 替换为href
【解决方案2】:

说明

这个正则表达式将:

  • 找到值以dta.zip结尾的锚标记href值
  • 避免有问题的边缘情况

&lt;a(?=\s|&gt;)(?=(?:[^&gt;=]|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*?\shref=\\(['"]?)((?:(?!\1(?:\s|\/&gt;|&gt;)).)*dta\.zip)\\)(?:[^&gt;=]|='[^']*'|="[^"]*"|=[^'"][^\s&gt;]*)*&gt;.*?&lt;\/a&gt;

示例

示例文本

注意第一行有一些困难的边缘情况

<a onmouseup="" onmouseover=' href=\"../data/anes_timeseries_2012/DontFindMe_dta.zip\" ; if (6 > x) { funRotate(href); } ' href=\"../data/anes_timeseries_2012/DifficultToFind_dta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-dta']);\">

"ANES Time Series Cumulative Data File</b><br /><a href=\"../cdf/cdf.htm\"> Study Page</a>&nbsp; | &nbsp;<a href=\"../cdf/cdf_errata.htm\">Errata</a>&nbsp; | &nbsp;<a href=\"../data/cdf/anes_cdf.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-ascii']);\">Download ascii data files  <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/cdf/anes_cdfpor.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-por']);\">Download .por file  <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/cdf/anes_cdfdta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-dta']);\">Download .dta file <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;August 25, 2011 version </td></tr>", 
    "ANES 2012 Time Series Study</b><br /><a href=\"../anes_timeseries_2012/anes_timeseries_2012.htm\">Study Page</a>&nbsp; | &nbsp;<a href=\"../anes_timeseries_2012/anes_timeseries_2012_errata.htm\">Errata</a>&nbsp; |  &nbsp;<a href=\"../data/anes_timeseries_2012/anes2012TS.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-ascii']);\">Download ascii data files <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/anes_timeseries_2012/anes2012TS_sav.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-sav']);\">Download .sav file</a> <a href=\"../data/anes_timeseries_2012/anes2012TS_sav.zip\"><img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;<a href=\"../data/anes_timeseries_2012/anes2012TS_dta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-dta']);\">Download .dta file <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>&nbsp; | &nbsp;July 1, 2013 version<br />ac

匹配项

[0][0] = <a onmouseup="" onmouseover=' href=\"../data/anes_timeseries_2012/DontFindMe_dta.zip\" ; if (6 > x) { funRotate(href); } ' href=\"../data/anes_timeseries_2012/DifficultToFind_dta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-dta']);\">

"ANES Time Series Cumulative Data File</b><br /><a href=\"../cdf/cdf.htm\"> Study Page</a>
[0][1] = "
[0][2] = ../data/anes_timeseries_2012/DifficultToFind_dta.zip


[1][0] = <a href=\"../data/cdf/anes_cdfdta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/cdf-dta']);\">Download .dta file <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>
[1][1] = "
[1][2] = ../data/cdf/anes_cdfdta.zip


[2][0] = <a href=\"../data/anes_timeseries_2012/anes2012TS_dta.zip\" onClick=\"javascript: _gaq.push(['_trackPageview','/downloads/2012TS-dta']);\">Download .dta file <img src=\"../../images/zip.jpg\" border=\"0\" width=\"23\" height=\"13\" /></a>
[2][1] = "
[2][2] = ../data/anes_timeseries_2012/anes2012TS_dta.zip

【讨论】:

  • 不错。但是您是否手动编写了这个正则表达式?还是你用什么工具写的?
  • 我在记事本中手动编写,然后使用在线正则表达式工具检查它是否像宣传的那样工作。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多