2016-09-01 167 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

我用這個提取這些作品:(這是從regexpr的parse.one功能的變化?)

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)將刪除所有不是最後(...)子文本(帶圓括號)的文本,然後將用文字連字符分割。

圖案的詳細資料

  • .* - 任何0+字符儘可能多的(貪婪)
  • \\( - 字面(
  • ([^()]+) - 第1組,將經由\\1稍後訪問捕獲除()以外的一個或多個字符
  • \\) - 一個文字)
  • .* - 任何零個或多個字符,直到字符串結尾。
0

這也許會做:

strsplit(str,"(\\+)|\\-([a-zA-Z]+)")[[1]] 
相關問題