这是一个字符串:
[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)
但正则表达式在任何地方都不匹配,并输出原始字符串。
我做错了什么?
答案 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"
这是有效的,因为前瞻是零宽度,这意味着它实际上不会消耗这些字符或从初始匹配位置向前移动。你可以在比赛开始时保持正确,这样你就可以在前瞻之外再次匹配那些相同的空间。
由于前瞻的零宽度特性,您的原始方法无法正常工作。您基本上要求先前查看当前位置,而不是实际前进,以查看是否有.
或-
。然后,如果找到,请查看一个或多个空格的相同位置。在您找到.
或-
的地方不能有空格。