使用正则表达式提取字符串的部分内容

时间:2016-09-01 22:43:20

标签: regex r

我有一堆包含模式的字符串,我想要提取。 它看起来如下:

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

所以我想要两个新专栏,一个是#34; AbcDfE&#34;部分,另一部分与后部,在这种情况下&#34; BB&#34;。

4 个答案:

答案 0 :(得分:0)

我会尝试这个

https://regex101.com/r/oH1dV5/1

Regex
> ([a-zA-Z]*)-([a-zA-Z]*)

Data
>AbcDfE-BB

答案 1 :(得分:0)

您可以使用sub删除不需要的内容,然后使用strsplit删除-

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

请参阅R demo

此处,sub(".*\\(([^()]+)\\).*", "\\1", str)将删除所有不是最后(...)子文本的文本(带括号),然后将使用文字连字符分割。

模式详情

  • .* - 尽可能多的0个字符(贪婪)
  • \\( - 文字(
  • ([^()]+) - 稍后将通过\\1访问第1组来捕获()以外的一个或多个字符
  • \\) - 文字)
  • .* - 任何零个或多个字符,直到字符串结尾。

答案 2 :(得分:0)

也许这样做:

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

答案 3 :(得分: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等...

上述函数将找到给定模式的所有匹配项,因此请注意模式的一般性。