2014-11-07 13 views
9

tôi có một loạt các biểu hiện như:Extract văn bản giữa các ký hiệu nhất định sử dụng Regular Expression trong R

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

tôi cần phải trích xuất các văn bản giữa các <i></i> "biểu tượng". Đây là, kết quả nên là:

"the text I need to extract" 

Tại thời điểm tôi đang sử dụng gsub trong R để tự loại bỏ tất cả những biểu tượng mà không phải là văn bản. Tuy nhiên, tôi muốn sử dụng một biểu thức chính quy để thực hiện công việc. Có ai biết một biểu thức chính quy để trích xuất giữa <i></i>?

Cảm ơn.

Trả lời

17

Nếu chỉ có một <i>...</i> là như trong ví dụ sau đó kết hợp tất cả mọi thứ lên đến <i> và tất cả mọi thứ từ </i> về phía trước và thay thế chúng cả với chuỗi rỗng:

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

cho:

[1] "the text I need to extract" 

Nếu có thể có nhiều lần xuất hiện trong cùng một chuỗi, hãy thử:

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

giống nhau trong ví dụ này.

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

Điều này sẽ làm điều đó cho bạn.

9

Cách tiếp cận này sử dụng gói tôi duy trì qdapRegex không phải là regex nhưng có thể được sử dụng cho bạn hoặc người tìm kiếm trong tương lai. Hàm rm_between cho phép người dùng trích xuất văn bản giữa một ràng buộc trái và phải và tùy chọn bao gồm chúng. Cách tiếp cận này rất dễ dàng trong đó bạn không cần phải nghĩ đến một regex cụ thể, chỉ là ranh giới chính xác trái và phải:

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" 

tôi sẽ chỉ ra rằng nó có thể là đáng tin cậy hơn để sử dụng một phân tích cú pháp html cho điều này việc làm.

+0

+1 để chỉ ra trình phân tích html nên được sử dụng cho văn bản này –

4

Nếu đây là html (có vẻ như nó là), bạn có lẽ nên sử dụng trình phân tích cú pháp html. Gói XML thể làm điều này

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" 

Mở toàn bộ tài liệu html, bạn có thể sử dụng

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

IMO đây là câu trả lời hay nhất vì đây là câu trả lời đáng tin cậy nhất. Tôi đã xem các trang trình bày này về phân tích cú pháp HTML mà tôi thấy là tuyệt vời: http://gastonsanchez.com/work/webdata/getting_web_data_r4_parsing_xml_html.pdf –

4

Bạn có thể sử dụng các phương pháp sau đây với gregexprregmatches nếu bạn không biết số lượng các trận đấu trong một chuỗi.

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" 
Các vấn đề liên quan