2012-01-02 57 views
23

Tôi muốn sử dụng gsub của R để xóa tất cả các dấu chấm câu khỏi một văn bản ngoại trừ các dấu nháy đơn. Tôi khá mới để regex nhưng đang học.Xóa tất cả các dấu chấm câu ngoại trừ dấu nháy trong R

Ví dụ:

x <- "I like %[email protected]*&, chew;: gum, but don't like|}{[] [email protected]#^)(gum!?" 
gsub("[[:punct:]]", "", as.character(x)) 

Output Current (không dấu nháy đơn trong không)

[1] "I like to chew gum but dont like bubble gum" 

Output mong muốn (Tôi mong muốn các dấu nháy đơn trong không ở lại)

[1] "I like to chew gum but don't like bubble gum" 

Trả lời

31
x <- "I like %[email protected]*&, chew;: gum, but don't like|}{[] [email protected]#^)(gum!?" 
gsub("[^[:alnum:][:space:]']", "", x) 

[1] "I like to chew gum but don't like bubble gum" 

các regex trên là nhiều hơn nữa thẳng về phía trước. Nó thay thế mọi thứ không phải là ký hiệu chữ và số, dấu cách hoặc dấu nháy đơn (biểu tượng dấu mũ!) Với một chuỗi rỗng.

+0

Kay mã của bạn không xóa dấu nháy đơn. Đây là những gì tôi nghĩ rằng bạn có nghĩa là 'gsub (" [^ [: alnum:] [: không gian:] '\ "]", "", x) ' –

+0

Tôi thích làm thế nào thẳng về phía trước mã hóa này là –

+2

+1 - Ý tưởng ở đây chỉ là giải pháp rõ ràng nhất có thể, theo ý kiến ​​của tôi, chỉ cần chỉnh sửa dòng thứ hai để đọc 'gsub (" [^ [: alnum:] [: dấu cách:] '] "," ", x)' và (FWIW, dấu gạch chéo ngược không cần thiết bên trong regex) –

6

Dưới đây là một ví dụ:

> gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x) 
[1] "I like to chew gum but don't like bubble gum" 
+0

Chính xác những gì tôi đã hy vọng. Cách phức tạp hơn mà tôi nghĩ rằng nó sẽ được. Không có thắc mắc tôi đã gặp rắc rối. Tôi sẽ thực sự tách rời những gì bạn đã làm. Cảm ơn bạn. –

+1

Cuối cùng, đây sẽ là cách đơn giản nhất 'gsub (". *? ($ | '| [^ [: Dấu chấm:]]). *? "," \\ 1 ", x)'. – kohske

+0

Cảm ơn bạn đã theo dõi. Nó hoạt động cũng như đầu tiên và đơn giản hơn để làm theo. +1 –

4

Chủ yếu là cho đa dạng, đây là một giải pháp sử dụng gsubfn() từ gói tuyệt vời cùng tên. Trong ứng dụng này, tôi giống như cách độc đáo biểu là giải pháp cho phép là:.

library(gsubfn) 
gsubfn(pattern = "[[:punct:]]", engine = "R", 
     replacement = function(x) ifelse(x == "'", "'", ""), 
     x) 
[1] "I like to chew gum but don't like bubble gum" 

(Đối số engine = "R" là cần thiết ở đây là nếu không động cơ tcl mặc định sẽ được sử dụng quy tắc của nó cho phù hợp với biểu thức thông thường là hơi khác nhau: nếu nó được sử dụng để xử lý chuỗi trên, ví dụ, người ta sẽ cần phải thay thiết pattern = "[[:punct:]$|^]". Nhờ G. Grothendieck đã chỉ ra rằng chi tiết.)

+2

Một cảnh báo trước - vì lý do nào đó, lớp ký tự '[: punct:]', khi được sử dụng trong đối số 'pattern' của một cuộc gọi' gsubfn() ', không khớp với các ký tự' $ ',' | ', hoặc'^'như trong cuộc gọi đến' gsub() '. Vì thế tôi phải thêm chúng 'bằng tay'. –

+2

'gsubfn' sử dụng biểu thức chính quy tcl theo mặc định. Sử dụng đối số 'engine =" R "' nếu bạn muốn sử dụng các biểu thức chính quy R. –

+0

@ G.Gothendieck - Cảm ơn bạn đã chỉ ra điều đó. Tôi đã kết hợp nó trong câu trả lời của tôi. Tôi đã lấy tài liệu trong '? Gsubfn', trong đó nói rằng' mẫu: Giống như 'mẫu' trong 'gsub'', có nghĩa là các mẫu nên được chỉ định theo cùng một cách. Bây giờ tôi thấy những gì đã được có nghĩa là do đó, nhưng tự hỏi liệu một dòng bổ sung có thể giúp đỡ. Một cái gì đó như 'Nếu động cơ =" R ", chuỗi ký tự sẽ được kết hợp như được ghi lại bởi 'trợ giúp (regex)'. Nếu công cụ tcl mặc định được sử dụng, các mẫu sẽ được khớp với tư liệu tại ... '.Trong mọi trường hợp, cảm ơn công việc của bạn về gói! –

2

Bạn có thể loại trừ dấu nháy từ lớp POSIX punct sử dụng một tiêu cực kép:

[^'[:^punct:]] 

Code:

x <- "I like %[email protected]*&, chew;: gum, but don't like|}{[] [email protected]#^)(gum!?" 
gsub("[^'[:^punct:]]", "", x, perl=T) 

#[1] "I like to chew gum but don't like bubble gum" 

ideone demo

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