2013-07-21 1 views
3

Извините, если это дубликат .. это мне не ясно из того, что уже доступно на SO, как выполнить эту конкретную задачу ..Как извлечь строку, что и соответствует определённому шаблону и лежит между двумя другими строками

Моя цель - найти имя файла в zip-файле внутри некоторого 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 />" 
) 

Похоронен глубоко в первой строке, есть текст <a href=\"../data/cdf/anes_cdfdta.zip\" и во второй строке, есть текст <a href=\"../data/anes_timeseries_2012/anes2012TS_dta.zip\"

Из них две строки, я хотел бы извлечь ../data/cdf/anes_cdfdta.zip и ../data/anes_timeseries_2012/anes2012TS_dta.zip, потому что они содержат текст dta.zip и потому, что они начинаются с <a href=\", а затем заканчиваются \"

Я хочу кое-где:

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

производит символьный вектор длиной два с ..

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

Все файлы имеют ДТА.почтовый индекс? –

+2

'gsub (" (. * A href = \\\ ") (. * Dta \\. Zip) (. *) $", "\\ 2", string.examples) '? – Arun

+0

@Arun dammit i am так что паршивые регулярные выражения .. можете ли вы поместить это как ответ, и я отметю его правильно? спасибо !!!!!!!!!!!!! –

ответ

3

Здесь я предполагаю, что patterm вы ищете начинается после того, как a href=\" и заканчивается dta.zip. Поэтому идея состоит в том, чтобы использовать жадный поиск, чтобы пройти через все a href до dta.zip. Кроме того, мы фиксируем каждую часть и заменяем искомую строку требуемым захватом.

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

.*a href=\\\", как упоминалось ранее «жадных» поиски картины (пришлось бежать \ и «). Затем, выполнив .*data\\.zip, мы ограничиваем жадного поиска, чтобы не выйти за пределы точки, где мы требуем. Кроме того, это это шаблон we'are интересует Таким образом, мы уверены, чтобы захватить то, а потом все остальное очевидно, затем заменить шаблоном является вторым захватом

+0

woah so awesome –

+0

Спасибо Энтони. Вы можете заменить 'a href' на' href', если вы ожидаете иметь «onmouseover href» и другие варианты. – Arun

2

Описания

Это регулярное выражение будет:....

  • найти значение HREF тега привязки, где значение заканчивается dta.zip
  • избежать проблемных случаев краевых

<a(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=\\(['"]?)((?:(?!\1(?:\s|\/>|>)).)*dta\.zip)\\)(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>.*?<\/a>

Примеру

Образца текст

Обратите внимание на первую линию имеет некоторые трудные краевые случаи

<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 
+1

Nice. Но вы пишете это регулярное выражение вручную или используете какой-либо инструмент для его написания? – agstudy

+1

Я написал его вручную в блокноте, затем я использовал онлайн-инструмент регулярного выражения, чтобы проверить, что он работает как рекламируемый. –

 Смежные вопросы

  • Нет связанных вопросов^_^