Regex 使用lookahead断言正则表达式拆分字符串

Regex 使用lookahead断言正则表达式拆分字符串,regex,r,strsplit,Regex,R,Strsplit,下面是一个字符串: [1] "5 15 3 23 11 59 44.7 -.263226218521e-03 .488853402202e-11 .000000000000e+01" 我需要把它分成若干空格,将前7个数字放在一起,如下所示: [1] "5 15 3 23 11 59 44.7" "-.263226218521e-03" ".488853402202e-11" ".000000000000e+01" 所以我尝试使用一个lookahead正则表达式,用后跟一个点或减号

下面是一个字符串:

[1] "5 15  3 23 11 59 44.7 -.263226218521e-03  .488853402202e-11  .000000000000e+01"
我需要把它分成若干空格,将前7个数字放在一起,如下所示:

[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"  ".488853402202e-11"  ".000000000000e+01"
所以我尝试使用一个lookahead正则表达式,用后跟一个点或减号的空格进行分割:

strsplit(mystring,"(?=[-.]) +",perl=T)

但是正则表达式在任何地方都不匹配,并且输出原始字符串


我做错了什么?

如果要在后跟
-
的空格上拆分,则需要在找到空格后使用前瞻

strsplit(mystring, " +(?=[-.])", perl=TRUE)
#[[1]]
#[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"   ".488853402202e-11"   
#[4] ".000000000000e+01"
请注意,使用保留字
TRUE
(即不能重新定义)而不是可以重新定义的
t
,这被认为是一种良好的做法


如果出于某种原因,您希望首先放置前瞻,那么您需要匹配前瞻内部的空格和
[-.]
,然后匹配正则表达式外部的相同空格:

strsplit(mystring, "(?= +[-.]) +", perl=TRUE)
[[1]]
[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"    ".488853402202e-11"    
[4] ".000000000000e+01" 
这是因为前瞻是零宽度的,这意味着它实际上不会使用这些字符或从初始匹配位置向前移动。您将停留在比赛的开始处,这允许您在“前瞻”之外再次匹配这些相同的空格


由于前瞻的零宽度特性,您最初的方法不起作用。实际上,您是在要求向前看当前位置,而不是向前看,以查看是否存在
-
。然后,如果找到,在同一地点寻找一个或多个空间。在找到
-

的位置不能有空格。请提供字符串的
dput()
strsplit(mystring, "(?= +[-.]) +", perl=TRUE)
[[1]]
[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"    ".488853402202e-11"    
[4] ".000000000000e+01"