R提取部分匹配的字符串

时间:2020-04-21 17:18:21

标签: r regex

我有一个问题,要从具有以下行的几个文件中提取字符串的一部分:

单位=指定 -名称0 = prDM:压力,Digiquartz [db] -名称1 = t090C:温度[ITS-90,摄氏度] -名称2 = c0S / m:电导率[S / m] -名称3 = t190C:温度,2 [ITS-90,摄氏度] -名称4 = c1S / m:电导率,2 [S / m] -名称5 = flSP:荧光,Seapoint -名称6 = sbeox0ML / L:氧气,SBE 43 [ml / l] -名称7 = altM:高度计[m] -名称8 = sal00:盐度,实用[PSU] -名称9 = sal11:盐度,实用,2 [PSU] -范围0 = 1.000,42.000

我只需要提取以“ name”开头的列的信息,并提取=和:之间的所有内容。 例如,在“名称0 = prDM:压力,Digiquartz [db]”行中,所需结果将是prDM。 一些文件具有不同数量的“名称”行(即,该示例具有13行,而其他文件具有16行,并且数量有所不同),所以我希望它尽可能通用,因此我可以始终独立提取正确的字符串行数。行以#开头,名称前有一个空格。 我已经尝试过此代码,但它仅提取第一行。你能帮我吗?非常感谢!

CNV<-NULL
for (i in 1:nro.files){
x <- readLines(all.files[i])
name.col<-grep("^\\# name", x) 
df <- data.table::fread(text = x[name.col])
CNV[[i]]<-df
}

3 个答案:

答案 0 :(得分:0)

使用stringr和正则表达式模式"name \\d+ = (.*?):",在单词中表示“名称,后跟一个或多个数字,后跟等号,后跟一个空格,后跟一个包含任何字符的捕获组(句点)零次或多次(*),后接一个冒号”。

   library(stringr)
    strings <- c("name 0 = prDM: Pressure, Digiquartz [db]",
    "name 1 = t090C: Temperature [ITS-90, deg C]",
    "name 2 = c0S/m: Conductivity [S/m]",
    "name 3 = t190C:Temperature, 2 [ITS-90, deg C]",
    "name 4 = c1S/m: Conductivity, 2 [S/m]",
    "name 5 = flSP: Fluorescence, Seapoint",
    "name 6 = sbeox0ML/L: Oxygen, SBE 43 [ml/l]",
    "name 7 = altM: Altimeter [m]",
    "name 8 = sal00: Salinity, Practical [PSU]",
    "name 9 = sal11: Salinity, Practical, 2 [PSU]")

    result <- str_match(strings, "name \\d+ = (.*):")
    result[,2]
 [1] "prDM"       "t090C"      "c0S/m"      "t190C"      "c1S/m"      "flSP"       "sbeox0ML/L"
 [8] "altM"       "sal00"      "sal11"

或者,如果您更喜欢base

pattern = "name \\d+ = (.*):"
result <- regmatches(strings, regexec(pattern, strings))
sapply(result, "[[", 2)

 [1] "prDM"       "t090C"      "c0S/m"      "t190C"      "c1S/m"      "flSP"       "sbeox0ML/L"
 [8] "altM"       "sal00"      "sal11" 

答案 1 :(得分:0)

使用软件包str_extract中的stringr并积极向前和向后看:

str <- "name 0 = prDM: Pressure, Digiquartz [db]"

str_extract(str, "(?<== ).*(?=:)")
[1] "prDM"

说明:

(?<== ),如果您看到=,其后是左侧的空白(向后看)

.*匹配所有内容,直到...

(?=:) ...您在右边看到一个冒号(向前看)

答案 2 :(得分:0)

在基本R中

var result = document.getElementById("name");
var final = result.getElementsByTagName("span");
console.log(final);

解释

test <- c("name 0 = prDM: Pressure, Digiquartz [db]","name 1 = t090C: Temperature [ITS-90, deg C]") gsub("^name [0-9]+ = (.+):.+","\\1",test) [1] "prDM" "t090C" 搜索名称以任何长度的数字结尾的字符串^name [0-9]+的开头

^= (.+):+之间发现的任何字符.的任何长度=被存储:,以后由{{ 1}}

相关问题