2013-09-02 5 views
1

Я рекреационный программист без тренировки регулярных выражений, поэтому я борюсь с этой проблемой. Я нашел пример здесь:Возвратные номера между скобками

Is there an efficient way of returning a sub-section of a text string

где GSUB был использован для извлечения чисел между двумя периодами. Мне нужно сделать то же самое, но я ищу числа между квадратными скобками, как в tmpstr1. Может ли кто-нибудь помочь мне понять регулярное выражение в примере gsub, чтобы я мог изменить его и заставить его работать? В основном, как читать часть регулярного выражения на английском языке, так что это имеет смысл? Я просто не понимаю.

Благодаря

set.seed(1) 
n <- 50 
let1 <- LETTERS[runif(n, min=1, max=26)] 
num <- round(runif(100, min=1, max=100)) 
let2 <- c(LETTERS[runif(n, min=1, max=26)], LETTERS[runif(n, min=1, max=26)]) 
tmpstr <- paste(let1, num, let2, sep=".") 
tmpstr 

gsub('.*[.](.*)[.].*','\\1',tmpstr) 

tmpstr1 <- paste0(let1, "[", num, "]", let2) 
tmpstr1 
+0

Это также заменяет точки на [] и включает только f Смешанные строки: 'sub (". ","] ", sub (". "," [", tmpstr, fixed = TRUE), fixed = TRUE)' ' –

ответ

0

ответ LGTrader является лучше для тех, кто хочет узнать регулярное выражение (мой голос там), но это для тех, кто не хочет изучать регулярное выражение:

library(qdap) 
x <- bracketXtract(tmpstr1, "square") 
unname(unlist(x)) 

## > unname(unlist(bracketXtract(tmpstr1, "square"))) 
## [1] "48" "86" "44" "25" "8" "11" "32" "52" "67" "41" "91" "30" "46" "34" "65" 
## [16] "27" "48" "77" "9" "88" "35" "84" "35" "34" "48" "89" "87" "40" "78" "96" 
## [31] "44" "72" "41" "33" "76" "21" "71" "13" "25" "15" "25" "7" "65" "88" "78" 
## [46] "80" "46" "42" "81" "61" "66" "36" "28" "99" "64" "22" "14" "48" "92" "60" 
## [61] "98" "73" "36" "44" "16" "2" "72" "11" "45" "64" "99" "50" "49" "18" "76" 
## [76] "46" "52" "22" "24" "60" "58" "9" "5" "65" "93" "60" "57" "53" "99" "51" 
## [91] "69" "61" "25" "27" "73" "46" "18" "75" "11" "87" 
+1

Вы можете немного почистить это - это не очевидно, почему вы определяете 'x', а затем полностью игнорируете его в следующей строке. – Dason

+0

@ Дайсон, вы правы. Исправлено, я сделал это с мобильного телефона. –

+0

Ну тогда хорошая работа! – Dason

1

После размещения вопрос я нашел пример, который, кажется, работает:

gsub('.+\\[([0-9]+)\\].+?$', '\\1', tmpstr1) 
Смежные вопросы