需要从字符串中的模式创建数据框

时间:2013-12-04 16:25:39

标签: regex r

我需要以下字符串将模式提取到名为SIZE的单个列数据框

str <- "N · 0.1 [mm]: N · 0.1 + 0.02 [mm]: N · 0.1 + 0.05 [mm] N · 0.1 + 0.08 [mm] M · 1 [mm]: M · 1 + 0.5 [mm] M · 1 + 0.75 [mm]"

模式后跟:whitespace,并始终以[mm]

结尾

我用来匹配我的模式的正则表达式是可行的,但我不确定如何提取匹配项以创建列作为数据框。

\S\W+\d\.?\d?\s\+?\s?\d?\.?\d?\d?\s?\[mm\]

预期输出:1列名为SIZE

       N · 0.1 [mm]
N · 0.1 + 0.02 [mm]
N · 0.1 + 0.05 [mm]
N · 0.1 + 0.08 [mm]
         M · 1 [mm]
   M · 1 + 0.5 [mm]
  M · 1 + 0.75 [mm]

任何帮助表示赞赏。感谢..

2 个答案:

答案 0 :(得分:5)

也许,strsplit会让事情变得更容易......

str  <- "N · 0.1 [mm]: N · 0.1 + 0.02 [mm]: N · 0.1 + 0.05 [mm] N · 0.1 + 0.08 [mm] M · 1 [mm]: M · 1 + 0.5 [mm] M · 1 + 0.75 [mm]"
vals <- strsplit(str, '(?<=\\])[\\s:]*', perl = T)
data.frame(SIZE = unlist(vals))

输出

                 SIZE
1        N · 0.1 [mm]
2 N · 0.1 + 0.02 [mm]
3 N · 0.1 + 0.05 [mm]
4 N · 0.1 + 0.08 [mm]
5          M · 1 [mm]
6    M · 1 + 0.5 [mm]
7   M · 1 + 0.75 [mm]

答案 1 :(得分:2)

以下是获取数据的一种方法:将“[mm]”的任何实例替换为“[mm]:”,将scan文本替换为“:”作为分隔符。没有与正则表达式混淆....

scan(what = "", text = gsub("[mm] ", "[mm]: ", str, fixed=TRUE), 
     sep = ":", strip.white=TRUE)
# Read 7 items
# [1] "N · 0.1 [mm]"        "N · 0.1 + 0.02 [mm]" "N · 0.1 + 0.05 [mm]"
# [4] "N · 0.1 + 0.08 [mm]" "M · 1 [mm]"          "M · 1 + 0.5 [mm]"   
# [7] "M · 1 + 0.75 [mm]"  

只需将结果分配给data.frame中的列,或者使用输出创建data.frame。或者,一体化:

data.frame(
  SIZE = scan(text = gsub("[mm] ", "[mm]: ", str, fixed=TRUE), 
              sep = ":", strip.white=TRUE, what = ""))