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

时间:2015-12-28 02:11:58

标签: 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"

所以我试图使用前瞻性正则表达式来分隔后跟点或减号的空格:

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

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

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

我做错了什么?

1 个答案:

答案 0 :(得分:3)

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

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" 

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

由于前瞻的零宽度特性,您的原始方法无法正常工作。您基本上要求先前查看当前位置,而不是实际前进,以查看是否有.-。然后,如果找到,请查看一个或多个空格的相同位置。在您找到.-的地方不能有空格。