2017-10-26 58 views
5

Tôi cố gắng trích xuất chuỗi con theo mẫu bằng hàm gsub() R.Làm thế nào để trích xuất một chuỗi con bằng mẫu nghịch đảo với R?

# Example: extracting "7 years" substring. string <- "Psychologist - 7 years on the website, online" gsub(pattern="[0-9]+\\s+\\w+", replacement="", string)

[1] "Psychologist - on the website, online"

Như bạn thấy, thật dễ dàng để exlude chuỗi con cần thiết sử dụng gsub(), nhưng tôi cần phải đảo ngược kết quả và nhận được "7 năm" mà thôi. Tôi nghĩ về việc sử dụng "^", một cái gì đó như thế:

gsub(pattern="[^[0-9]+\\s+\\w+]", replacement="", string)

Xin vui lòng, bất cứ ai có thể giúp tôi với mẫu regexp có đúng không?

+0

Các bạn, bạn có thể vui lòng giải thích cho tôi tại sao bạn sử dụng "\\ 1" trong 'replacement = "\\ 1"' không? – Michael

Trả lời

5

Bạn có thể sử dụng

sub(pattern=".*?([0-9]+\\s+\\w+).*", replacement="\\1", string) 

Xem this R demo.

Chi tiết

  • .*? - bất kỳ 0+ chars, càng ít càng tốt
  • ([0-9]+\\s+\\w+) - Chụp nhóm 1:
    • [0-9]+ - một hoặc nhiều chữ số
    • \\s+-1 hoặc nhiều khoảng trắng hơn
    • \\w+-1 hoặc nhiều từ chars
  • .* - phần còn lại của chuỗi (bất kỳ 0+ chars, càng nhiều càng tốt)

Các \1 trong việc thay thế thay thế với các nội dung của nhóm 1.

+0

Nó hoạt động. "\\ 1" trong đối số "thay thế" nghĩa là gì? Xin lỗi vì bình luận đầu tiên :) – Michael

+1

@Michael * Thay thế '\ 1' thay thế bằng nội dung của Nhóm 1 *. '\ 1' là [thay thế backreference] (https://www.regular-expressions.info/replacebackref.html). –

3

Bạn có thể sử dụng trái ngược với \d, đó là \D trong R:

string <- "Psychologist - 7 years on the website, online" 
sub(pattern = "\\D*(\\d+\\s+\\w+).*", replacement = "\\1", string) 
# [1] "7 years" 

\D* có nghĩa là: không có chữ số càng lâu càng tốt, phần còn lại được chụp trong một nhóm và sau đó thay thế chuỗi hoàn chỉnh.

Xem a demo on regex101.com.

+0

Cảm ơn. Giải pháp tốt. – Michael

Các vấn đề liên quan