Regex 使用正则表达式从R中的字符串获取数据

Regex 使用正则表达式从R中的字符串获取数据,regex,r,Regex,R,现在,字符串如下所示: "Interest.USD,Vol=[Integrated,(0,0.101),(0.2,0.108),(1,0.110),(2,0.106), (3,0.102),(4,0.09),(5,0.091),(6,0.09128272)],Drift=[Integrated,(0.002,0.09), (0.24,0.0007),(0.4,0.007),(1,-0.033),(2,-0.005),(3,-0.0041), (4,-0.3505),(5,-0.65),(7,-0

现在,字符串如下所示:

"Interest.USD,Vol=[Integrated,(0,0.101),(0.2,0.108),(1,0.110),(2,0.106),
(3,0.102),(4,0.09),(5,0.091),(6,0.09128272)],Drift=[Integrated,(0.002,0.09),
(0.24,0.0007),(0.4,0.007),(1,-0.033),(2,-0.005),(3,-0.0041),
(4,-0.3505),(5,-0.65),(7,-0.08346),(8,-0.049),(9,-0.0613),(10,-0.019)],
Risk_Neutral=YES,Lambda=0.09,FX_Volatility=0.01,FX_Correlation=0.9"
我想以矩阵格式获取“Vol”和“Drift”之后的数据,如:

体积矩阵:

0,0.101
0.2,0.108
1,0.110
2,0.106
3,0.102
4,0.09
5,0.091
6,0.09128272
以及单个值,如λ为0.09。我想我已经用过正则表达式了,但我对它不太熟悉。有什么建议吗?:)

附言。 我尝试使用:

str_extract_all(text,'[ .+? ]')

尝试获取数据bewteen[and],但它返回“.”

您可以尝试使用此正则表达式。括号内的值存储在单独的组中,存储的组通过反向引用再次引用

Vol=.*\(([\d,.]+)\).*\(([\d,.]+)\).*\(([\d,.]+)\).*\(([\d,.]+)\).*\(([\d,.]+)\).*\(([\d,.]+)\).*\(([\d,.]+)\).*\(([\d,.]+)\).*(?=,Drift)


查看右侧的存储组。

这里有一种在R中提取这些值的方法。假设您发布的字符串存储在名为
a
的变量中。为了使事情更简单,我将使用一个helper函数:。那你就可以了

expr <- "(Vol|Drift)=\\[Integrated,([^\\]]*)\\]"
mm <- regcapturedmatches(a,gregexpr(expr,a, perl=T))[[1]]
expr <- "\\(([^,]+),([^,]+)\\)"
vv <- regcapturedmatches(mm[,2],gregexpr(expr,mm[,2], perl=T))
最后,
dd
看起来像

     col  val.1       val.2
1    Vol  0.000  0.10100000
2    Vol  0.200  0.10800000
3    Vol  1.000  0.11000000
4    Vol  2.000  0.10600000
5    Vol  3.000  0.10200000
6    Vol  4.000  0.09000000
7    Vol  5.000  0.09100000
8    Vol  6.000  0.09128272
9  Drift  0.002  0.09000000
10 Drift  0.240  0.00070000
11 Drift  0.400  0.00700000
12 Drift  1.000 -0.03300000
13 Drift  2.000 -0.00500000
14 Drift  3.000 -0.00410000
15 Drift  4.000 -0.35050000
16 Drift  5.000 -0.65000000
17 Drift  7.000 -0.08346000
18 Drift  8.000 -0.04900000
19 Drift  9.000 -0.06130000
20 Drift 10.000 -0.01900000
此方法允许在每个部分中重复任意数量的值

如果你只是想要简单的矩阵那么

Map(function(a,b) {class(b)<-"numeric"; b}, mm[,1], 
    lapply(vv, function(x) {class(x)<-"numeric"; x}))

Map(函数(a,b){class(b)你应该使用正则表达式。你尝试过如何使用它们吗?@SeñorO嗨,谢谢你的评论。我用我尝试过的方式编辑了我的问题。欢迎对代码提出任何建议:)为什么您没有在输出中提到
2,0.106
?您的输入字符串中是否存在新行?@AvinashRaj抱歉..这是一个错误..我的输入字符串中没有新行input@Louisyan如果你觉得这个答案很好,那么别忘了接受它。
Map(function(a,b) {class(b)<-"numeric"; b}, mm[,1], 
    lapply(vv, function(x) {class(x)<-"numeric"; x}))