2014-11-07 14 views
9

ho una serie di espressioni come:testo estratto tra certi simboli uso delle espressioni regolari in R

"<i>the text I need to extract</i></b></a></div>" 

ho bisogno di estrarre il testo tra i "simboli" <i> e </i>. Questo è, il risultato dovrebbe essere:

"the text I need to extract" 

Al momento sto utilizzando gsub in R per rimuovere manualmente tutti i simboli che non sono testo. Tuttavia, mi piacerebbe usare un'espressione regolare per fare il lavoro. Qualcuno conosce un'espressione regolare per estrarre il numero compreso tra <i> e </i>?

Grazie.

risposta

17

Se v'è un solo <i>...</i> come nell'esempio poi corrisponde tutto fino <i> e tutto dal </i> avanti e entrambi sostituire con la stringa vuota:

x <- "<i>the text I need to extract</i></b></a></div>" 
gsub(".*<i>|</i>.*", "", x) 

dando:

[1] "the text I need to extract" 

Se potrebbero esserci più occorrenze nella stessa stringa, provare:

library(gsubfn) 
strapplyc(x, "<i>(.*?)</i>", simplify = c) 

dando lo stesso in questo esempio.

3
<i>((?:(?!<\/i>).)*)<\/i> 

Questo dovrebbe farlo per voi.

9

Questo approccio utilizza un pacchetto che mantengo qdapRegex che non è un'espressione regolare, ma potrebbe essere utile per voi o futuri utenti. La funzione rm_between consente all'utente di estrarre il testo tra un limite sinistro e destro e facoltativamente includerli. Questo approccio è facile in quanto non si deve pensare di una regex specifica, solo i confini esatti destro e sinistro:

library(qdapRegex) 

x <- "<i>the text I need to extract</i></b></a></div>" 

rm_between(x, "<i>", "</i>", extract=TRUE) 

## [[1]] 
## [1] "the text I need to extract" 

vorrei sottolineare che possa essere più affidabile di utilizzare un parser HTML per questo lavoro.

+0

+1 per aver ricordato un parser HTML deve essere utilizzato per questo testo –

4

Se questo è html (che sembra essere), probabilmente dovresti usare un parser html. Pacchetto XML può fare questo

library(XML) 
x <- "<i>the text I need to extract</i></b></a></div>" 
xmlValue(getNodeSet(htmlParse(x), "//i")[[1]]) 
# [1] "the text I need to extract" 

Su un intero documento HTML, è possibile utilizzare

doc <- htmlParse(x) 
sapply(getNodeSet(doc, "//i"), xmlValue) 
+1

IMO questa è la risposta migliore in quanto è il più affidabile. Mi sono imbattuto in queste diapositive sull'analisi dell'HTML che ho trovato eccellente: http://gastonsanchez.com/work/webdata/getting_web_data_r4_parsing_xml_html.pdf –

4

È possibile utilizzare il seguente approccio con gregexpr e regmatches se non si conosce il numero di partite in un stringa.

vec <- c("<i>the text I need to extract</i></b></a></div>", 
     "abc <i>another text</i> def <i>and another text</i> ghi") 

regmatches(vec, gregexpr("(?<=<i>).*?(?=</i>)", vec, perl = TRUE)) 
# [[1]] 
# [1] "the text I need to extract" 
# 
# [[2]] 
# [1] "another text"  "and another text" 
Problemi correlati