如何根据特定要求分隔字符串

时间:2019-01-17 20:24:44

标签: r regex

我有一个变量a,它包含如下字符:

DEVICE PRF .75MG 0.5ML
DEVICE PRF 1.5MG 0.5MLX4
CAP 12-25MG 30
CAP DR 60MG 100UD 3270-33 (32%)

我想将它们分为三个部分(或变量):

x               y               z
DEVICE PRF    .75MG            0.5ML
DEVICE PRF     1.5MG          0.5MLX4
CAP           12-25MG           30
CAP DR         60MG          100UD 3270-33 (32%)

第一部分是描述,第二部分是强度,第三部分是体积。 我想我可以使用gregexpr(),但不确定如何实现它。 任何建议表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用

library(stringr)
str_match(x, "(.*)[ ]{1,}(.*(MG|ML))[ ]{1,}(.*)")[, -c(1, 4)]
#      [,1]         [,2]      [,3]                 
# [1,] "DEVICE PRF" ".75MG"   "0.5ML"              
# [2,] "DEVICE PRF" "1.5MG"   "0.5MLX4"            
# [3,] "CAP"        "12-25MG" "30"                 
# [4,] "CAP DR"     "60MG"    "100UD 3270-33 (32%)"

假设第二/中间部分始终以MG或ML结尾,并且没有空格。

模式(.*)[ ]{1,}(.*(MG|ML))[ ]{1,}(.*)可以理解为:匹配的第一部分包含任何内容+至少一个空格+第二部分匹配以MG或ML结尾的末尾+至少一个空格+包含匹配的第三部分任何东西。

答案 1 :(得分:0)

使用中间部分没有空格且始终以.或数字开头的假设,我们可以在基数R中执行以下操作:

a <- c("DEVICE PRF .75MG 0.5ML", "DEVICE PRF 1.5MG 0.5MLX4",
       "CAP 12-25MG 30", "CAP DR 60MG 100UD 3270-33 (32%)")

a_as_csv <- sub('([^.0-9]*) ([.0-9][^ ]+) (.*)', '\\1,\\2,\\3', a)

read.csv(textConnection(a_as_csv), col.names = c('x', 'y', 'z'), header = F)
#            x       y                   z
# 1 DEVICE PRF   .75MG               0.5ML
# 2 DEVICE PRF   1.5MG             0.5MLX4
# 3        CAP 12-25MG                  30
# 4     CAP DR    60MG 100UD 3270-33 (32%)