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

R 如何根据特定要求分隔字符串,r,regex,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%) 我想把它们分成三部分(或变量): 第一部分是描述,第二部分是强度,第三部分是体积。 我想我可以使用gregexpr(),但不确定如何实现它。 如有任何建议,我们将不胜感激。谢谢大家! 您可以使用 library(stringr) str_match(x, "(.*)[ ]{

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

DEVICE PRF .75MG 0.5ML
DEVICE PRF 1.5MG 0.5MLX4
CAP 12-25MG 30
CAP DR 60MG 100UD 3270-33 (32%)
我想把它们分成三部分(或变量):

第一部分是描述,第二部分是强度,第三部分是体积。 我想我可以使用gregexpr(),但不确定如何实现它。 如有任何建议,我们将不胜感激。谢谢大家!

您可以使用

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结尾+至少一个空格+匹配的第三部分包含任何内容。

假设中间部分没有空格,并且始终以
或数字开头,我们可以在base 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%)

a是空格字符还是制表符?您可能希望为此使用正则表达式,但具体取决于定义不同组的规则。例如,这个正则表达式将分割您提供的数据,但它做出了一些可能不准确的假设。它可能以“ML”而不是“MG”结尾。@LiliaFeng,ok,在更新中考虑到了这一点。
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%)