2016-09-01 119 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]] 
相关问题