使用先行断言正则表达式拆分字符串

eph*_*ris 4 regex r strsplit

这是一个字符串:

[1] "5 15  3 23 11 59 44.7 -.263226218521e-03  .488853402202e-11  .000000000000e+01"
Run Code Online (Sandbox Code Playgroud)

我需要将前 7 个数字保留在一起的某些空格将其拆分,如下所示:

[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"  ".488853402202e-11"  ".000000000000e+01"
Run Code Online (Sandbox Code Playgroud)

因此,我尝试使用前瞻正则表达式按后跟点或减号的空格进行拆分:

strsplit(mystring,"(?=[-.]) +",perl=T)
Run Code Online (Sandbox Code Playgroud)

或者

strsplit(nraw,"(?=[-.])\\s+",perl=T)
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

Jot*_*ota 5

如果要拆分后跟 a-或 的空格.,则需要找到空格使用前瞻。

strsplit(mystring, " +(?=[-.])", perl=TRUE)
#[[1]]
#[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"   ".488853402202e-11"   
#[4] ".000000000000e+01"
Run Code Online (Sandbox Code Playgroud)

请注意,使用保留字TRUE(即不能重新定义)而不是可以重新定义的T,被认为是一种很好的做法。


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

strsplit(mystring, "(?= +[-.]) +", perl=TRUE)
[[1]]
[1] "5 15  3 23 11 59 44.7" "-.263226218521e-03"    ".488853402202e-11"    
[4] ".000000000000e+01" 
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为前瞻是零宽度,这意味着它实际上不会消耗这些字符或从初始匹配位置向前移动。您会在比赛开始时停留,这使您可以在前瞻之外再次匹配相同的空间。


由于前瞻的零宽度性质,您的原始方法不起作用。您本质上是要求先行查看当前位置,而不实际向前移动,以查看是否存在.-。然后,如果找到,请在同一位置查找一个或多个空格。找到 a.或的位置不能有空格-