2016-09-01 4 views
-3

У меня есть группа строк, которая содержит шаблон, который я хочу извлечь. Это выглядит следующим образом:Извлечение частей строки с регулярным выражением

str <- "Regular Expression Language (AbcDfE-BB)" 

Так что я хотел бы две новые колонки, одна с частью «AbcDfE», а другой с после - части, в данном случае «BB».

+2

Итак ... что вы пробовали до сих пор? – nrussell

+0

Является ли '(AbcDfE-BB)' частью всегда в конце ввода? –

+0

'read.table (text = gsub ('\\ ((. *) \\) |.', '\\ 1', str), sep = '-')' – rawr

ответ

0

Я использую это для извлечения этих частей: (Это вариация на parse.one функции от RegExpr?)

getMatchingPatterns <- function(data, pattern) { 

    result <- gregexpr(pattern, data, perl = TRUE) 
    do.call(rbind,lapply(seq_along(data), function(i) { 
    if(any(result[[i]] == -1)) return("") 
    st <- data.frame(attr(result[[i]], "capture.start")) 
    le <- data.frame(attr(result[[i]], "capture.length") - 1) 

    mapply(function(start,leng) substring(data[i], start, start + leng), st, le) 

})) 
} 

Затем мы определяем Perl в котором мы называем каждую переменную, в данном случае (И это большое предположение, основанное на одном примере),

pattern <- "\\((?<ABCPart>.*?)-(?<BPart>.*?)\\)"

так что первая часть я назвать ABCPart, а второй Bpart

затем вызвать функцию выше с этой схемой:

> getMatchingPatterns(str,pattern) 
     ABCPart BPart 
    [1,] "AbcDfE" "BB" 

Она возвращает его в виде матрицы, которая является легко конвертируется в data.frame, data.table и т. д. ...

Вышеупомянутая функция найдет ВСЕ соответствия для данного рисунка, поэтому будьте осторожны, как общий шаблон.

0

Вы можете удалить то, что вам не нужно с sub, а затем strsplit с -:

str <- "Regular Expression Language (AbcDfE-BB)" 
strsplit(sub(".*\\(([^()]+)\\).*", "\\1", str), "-", fixed=TRUE) 

Смотрите R demo

Здесь sub(".*\\(([^()]+)\\).*", "\\1", str) удалит весь текст, который не является последним (...) подтекстом (с круглыми скобками), а затем будет разделен на буквенный символ дефиса. Подробнее

Pattern:

  • .* - любые символы 0+ как можно больше (жадный)
  • \\( - буквальный (
  • ([^()]+) - Группа 1, которая позже будет доступна через \\1 захват 1 или более символов, кроме ( и )
  • \\) - буква )
  • .* - любые ноль или более символов до конца строки.
0

Возможно, это будет делать:

strsplit(str,"(\\+)|\\-([a-zA-Z]+)")[[1]] 
Смежные вопросы