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

Splitting a string using lookahead assertion regex

这是一个字符串:

[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"

所以我正在尝试使用前瞻性正则表达式来分割后跟一个点或减号的空格:

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

strsplit(nraw,"(?=[-.])\s+",perl=T)

但是regex哪里都不匹配,输出的是原字符串。

我做错了什么?

如果您想拆分后跟 -. 的 space,则需要在 after[=34] 后使用前瞻=] 你找到 space.

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

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


如果出于某种原因你想先进行前瞻,那么你需要匹配前瞻中的 space(s) 和 [-.],然后匹配相同的 space(s) 在正则表达式之外:

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

这是可行的,因为前瞻是零宽度的,这意味着它实际上并不消耗这些字符或从初始匹配位置向前移动。您停留在匹配的开头,这允许您在前瞻之外再次匹配那些相同的 space。


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