2017-07-21 36 views
1

我想用正则表达式来挑出多维单元中的单元,并将其输出为SI单元字符列表。将多维SI单元拆分为单个单元并列出它们

例如,拆分3种尺寸的单元:kg/h/mlkg h-1ml-1'kg''h''ml'

因此,分隔符总是前面或后面的空格,之后的-1或之前的/。有时候我也会得到一个.,那是在一个单位之前。

这意味着字符实际上并不重要,只要分隔符被识别。

我提供的n维“单元”的示例列表(在这种情况下,3):

eggie <- c('kg/h/ml', 'mg h-1kPa-1', 'kg h-1 l-1', 
      'kg /h /ml', 'kg/h/ml', '% /h.ml') 

输出应提供具有n个列的矩阵(在此情况下,3),否则在kgh-1l-1等第一个和第二个单元之间没有分隔符的情况下输出错误。

更新。为了提供有关“错误”的更多信息,因为我已经询问了它 - 如果n是3,但输出为列表中的任何字符串吐出2(或更少)单位,则它不应该输出矩阵在这种情况下。我大概可以编写这部分函数,​​但是如果任何人都可以让错误消息调出错误的位置,那将是非常棒的(因为这会让我老掉牙,但是其他人,秒)。

 [,1] [,2] [,3] 
[1,] "kg" "h" "ml" 
[2,] "mg" "h" "kPa" 
[3,] "kg" "h" "l" 
[4,] "kg" "h" "ml" 
[5,] 'kg" "h" "ml" 
[6,] "%" "h" "ml" 

我已经通过在this教程以及图,它可能需要含有的gsubstrsplit的组合的功能消失(I可能是错误的共)。但这就像为我学习一门全新的语言。

任何帮助(或指出正确的资源来弄清楚)非常感谢。

+0

可以ü显示完整的预期输出 – akrun

+1

这里是一个'基R'方法函数read.table'(文本= GSUB(“[^%[:阿尔法:]]“”“”,eggie),header = FALSE)' – akrun

+0

如果'kgh-1l-1'在输入中,您没有指定它的外观。你的意思是你根本不需要矩阵吗? –

回答

1

似乎要分割你有确切的分隔符图案的数据,这是

  • - +数字(S)
  • 的字符之一:/.或空白

这种情况的图案是

pat <- "(?:-1|[/.[:space:]])+" 

(?:-1|[/.[:space:]])+该正则表达式模式-1炭序列(-1)或(|)任何字符即/,或.空白([/.[:space:]])的1个或多个序列相匹配。

使用

read.table(text=gsub(pat, " ", eggie), header=FALSE, col.names=c("Unit1","Unit2","Unit3")) 

参见R demo

一旦未如预期字段的数量,将产生错误(见stderr):

错误扫描(文件= file,what = what,sep = sep,quote = quote,dec = dec,:
第7行没有3个元素
呼叫:函数read.table - >扫描
执行叫停

相关问题