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

4

这是一个字符串:

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

但是正则表达式没有匹配到任何内容,输出的仍然是原来的字符串。
我做错了什么?

请提供您字符串的 dput() - user3710546
1个回答

6
如果您想在空格后跟随 -. 进行拆分,则需要在找到空格后使用前瞻。
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" 

这种方法有效是因为向前查找是零宽度的,意味着它不会真正消耗那些字符或者从初始匹配位置向前移动。你停留在匹配的开始位置,这使你能够在向前查找之外再次匹配相同的空格。
你最初的方法无法成功,是因为向前查找的零宽度特性。你本质上要求向前查找当前位置,而不实际向前移动,以查看是否有点号(.)或破折号(-)。然后,如果找到了,就在该位置查找一个或多个空格。在你找到点号或破折号的地方,那里不能有空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接