我有一堆包含我想要提取的模式的字符串。 它看起来像如下:使用正则表达式提取字符串的部分
str <- "Regular Expression Language (AbcDfE-BB)"
所以我想两个新列,一个与“AbcDfE”的一部分,和其他与后 - 的一部分,在这种情况下,“BB”。
我有一堆包含我想要提取的模式的字符串。 它看起来像如下:使用正则表达式提取字符串的部分
str <- "Regular Expression Language (AbcDfE-BB)"
所以我想两个新列,一个与“AbcDfE”的一部分,和其他与后 - 的一部分,在这种情况下,“BB”。
我用这个提取这些作品:(这是从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等...
上面的函数会查找给定模式的所有匹配项,因此请注意您的模式有多普遍。
您可能会删除你不sub
需要,然后strsplit
与-
:
str <- "Regular Expression Language (AbcDfE-BB)"
strsplit(sub(".*\\(([^()]+)\\).*", "\\1", str), "-", fixed=TRUE)
这里,sub(".*\\(([^()]+)\\).*", "\\1", str)
将删除所有不是最后(...)
子文本(带圆括号)的文本,然后将用文字连字符分割。
图案的详细资料:
.*
- 任何0+字符尽可能多的(贪婪)\\(
- 字面(
([^()]+)
- 第1组,将经由\\1
稍后访问捕获除(
和)
以外的一个或多个字符\\)
- 一个文字)
.*
- 任何零个或多个字符,直到字符串结尾。这也许会做:
strsplit(str,"(\\+)|\\-([a-zA-Z]+)")[[1]]
所以...你到目前为止尝试过什么? – nrussell
“(AbcDfE-BB)”部分是否始终处于输入末尾? –
'read.table(text = gsub('\\((。*)\\)|。','\\ 1',str),sep =' - ')' – rawr