我有一堆包含模式的字符串,我想要提取。 它看起来如下:
str <- "Regular Expression Language (AbcDfE-BB)"
所以我想要两个新专栏,一个是#34; AbcDfE&#34;部分,另一部分与后部,在这种情况下&#34; BB&#34;。
答案 0 :(得分:0)
答案 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等...
上述函数将找到给定模式的所有匹配项,因此请注意模式的一般性。