2014-12-02 18 views
5

Tôi vừa mới bắt đầu sử dụng lại R và tôi tự hỏi có cách nào thay thế một phần của chuỗi bằng ký tự đại diện không.R - thay thế một phần của chuỗi bằng cách sử dụng ký tự đại diện

Ví dụ:

nói rằng tôi có

S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa" 

và tôi muốn thay thế tất cả mọi thứ trong dấu ngoặc vuông với 'x', chẳng hạn rằng chuỗi mới là

"aaaaaaaaa[x]aaaa[x]aaaa" 

Đây có phải là có thể làm trong R?

Xin lưu ý những gì nằm trong ngoặc vuông có thể có độ dài thay đổi.

Trả lời

8

Một regex đơn giản sẽ như thế nào

\\[.+?\\] 

Ví dụhttp://regex101.com/r/xE1rL1/1

Ví dụ cách dùng

s1 <- 'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa' 
gsub("\\[.+?\\]", "[x]", s1) 
## [1] "aaaaaaaaa[x]aaaa[x]aaaa" 

biểu hiện thường xuyên

  • \\[ trận mở [

  • .+? hợp không tham lam bất cứ điều gì

  • \\] trận đấu kết thúc ]

EDIT

Để an toàn, nếu không có gì hiện diện trong các [] thì regex có thể được sửa đổi một chút như

s1 <- 'aaaaaaaaa[]aaaa[bbbbbbb]aaaa' 
gsub("\\[.*?\\]", "[x]", s1) 
##[1] "aaaaaaaaa[x]aaaa[x]aaaa" 
+1

(+1) đẹp nhất –

+0

@DavidArenburg Cảm ơn bạn đã chỉnh sửa. Sẽ thêm một số chi tiết vào câu trả lời – nu11p01n73R

+4

nếu không có gì ở giữa các dấu ngoặc vuông? như "aaa [] aaa [bbb]"? có lẽ bạn có thể thay thế '+' bằng '*'? – Cath

3

Sử dụng các xác nhận tích cực và trông giống như dưới đây.

"(?<=\\[)[^\\[\\]]*(?=\\])" 

Sau đó thay thế các ký tự tương ứng với x

> S1<-'aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa' 
> gsub("(?<=\\[)[^\\[\\]]*(?=\\])", "x", S1, perl=TRUE) 
[1] "aaaaaaaaa[x]aaaa[x]aaaa" 

Giải thích:

  • (?<=\\[) lookbehind tích cực khẳng định rằng chuỗi bạn muốn kết hợp phải được đi trước bởi [ biểu tượng.
  • [^\\[\\]]* Khớp bất kỳ ký tự nào nhưng không phải là [ hoặc ] không hoặc nhiều lần.
  • (?=\\]) Người trả lời tích cực xác nhận rằng khớp phải được theo sau bởi biểu tượng ].
+0

Không sử dụng thực tế của lookaheads đây !!!!!! có vẻ như một overkill – vks

+0

lookarounds không phải là một quá mức cần thiết ở đây. –

5

cũng có thể thử qdapRegex gói trong đó có một phương pháp đặc biệt đối với những vấn đề như: rm_square

library(qdapRegex) 
S1 <- "aaaaaaaaa[aaaaa]aaaa[bbbbbbb]aaaa" 
rm_square(S1, replacement = "[x]") 
## [1] "aaaaaaaaa[x]aaaa[x]aaaa" 

Sẽ hoạt động tương tự cho các dấu ngoặc trống

S1 <- "aaaaaaaaa[]aaaa[bbbbbbb]aaaa" 
rm_square(S1, replacement = "[x]") 
## [1] "aaaaaaaaa[x]aaaa[x]aaaa" 
+2

Cảm ơn vì điều này. Một thư viện khác để thêm. :) – dkr267

0
\\[[^\\]]+ 

Bạn chỉ có thể thực hiện việc này mà không cần phải nhìn hoặc soá vật gì.Xếp hạng bởi [x .Xem demo.

http://regex101.com/r/yR3mM3/13

+0

Mặc dù vậy, sẽ không hoạt động đối với 'aaaaaaaaa [] aaaa [bbbbbbb] aaaa'. Dù bằng cách nào, bạn có thể gói câu trả lời của bạn vào một cái gì đó như 'gsub (" \\ [[^ \\]] + "," [x ", s1, perl = TRUE)' –

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