我有一堆包含我想要提取的模式的字符串。 它看起來像如下:使用正則表達式提取字符串的部分
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