2016-05-19 16 views
5

Tôi đang sử dụng gsub trong R để thêm văn bản vào giữa chuỗi. Nó hoạt động hoàn hảo nhưng vì lý do nào đó, khi vị trí quá dài nó sẽ gây ra lỗi. Mã này là dưới đây:Rắc rối với gsub và regex trong R

gsub(paste0('^(.{', as.integer(loc[1])-1, '})(.+)$'), new_cols, sql) 
Error in gsub(paste0("^(.{273})(.+)$"), new_cols, sql) : invalid 
    regular expression '^(.{273})(.+)$', reason 'Invalid contents of {}' 

Mã này hoạt động tốt khi số trong ngoặc (273 trong trường hợp này) là ít nhưng không phải khi nó là lớn này.


này tạo ra các lỗi:

sql <- "The cat with the bat went to town. He ate the fat mat and wouldn't stop til the sun came up. He was a fat cat that lived with a rat who owned many hats.The cat with the bat went to town. He ate the fat mat and wouldn't stop til the sun came up. He was a fat cat that lived with a rat who owned many hats." 
new_cols <- "happy" 
gsub('^(.{125})(.+)$', new_cols, sql) #**Works 
gsub('^(.{273})(.+)$', new_cols, sql) 
Error in gsub("^(.{273})(.+)$", new_cols, sql) : invalid regular 
    expression '^(.{273})(.+)$', reason 'Invalid contents of {}' 
+2

nội dung của 'loc',' new_cols' và 'là gì sql'can bạn thực hiện một [ví dụ tái sản xuất] (http://stackoverflow.com/questions/5963269/how -to-make-a-great-r-reproducible-example/5965451 # 5965451) làm ơn? –

+1

Bạn đang dán gì hoặc cố dán vào 'paste0'? – Parfait

+1

Tôi thử nghiệm nó và nó hoạt động cho đến 255 và không hoạt động với các giá trị trên 255. Có lẽ 'gsub' chỉ chấp nhận' {n} 'giá trị chỉ lên đến một kích thước của một byte trong regexs ?! – FlorianSchunke

Trả lời

13

nền

R gsub sử dụng thư viện regex TRE theo mặc định. Ranh giới trong định lượng giới hạn có hiệu lực từ 0 đến RE_DUP_MAX được xác định trong mã TRE. Xem this TRE reference:

A bound is one of the following, where n and m are unsigned decimal integers between 0 and RE_DUP_MAX

Dường như RE_DUP_MAX được thiết lập đến 255 (xem TRE source file này cho thấy #define RE_DUP_MAX 255), và do đó, bạn không thể sử dụng nhiều trong {n,m} hạn chế lượng hóa.

Giải pháp

Sử dụng PCRE regex hương vị, thêm perl = TRUE và nó sẽ làm việc.

R demo:

> sql <- "The cat with the bat went to town. He ate the fat mat and wouldn't stop til the sun came up. He was a fat cat that lived with a rat who owned many hats.The cat with the bat went to town. He ate the fat mat and wouldn't stop til the sun came up. He was a fat cat that lived with a rat who owned many hats." 
> new_cols <- "happy" 
> gsub('^(.{273})(.+)$', new_cols, sql, perl=TRUE) 
[1] "happy" 
+2

Cảm ơn! Hoạt động tuyệt vời! – Soxman

+1

@David, 'perl = T' =' perl = TRUE'. –

+3

[Bạn không nói ...] (http://www.r-bloggers.com/r-tip-avoid-using-t-and-f-as-synonyms-for-true-and-false/) –

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