这是一个字符串:
[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)
但是正则表达式在任何地方都不匹配,输出原始字符串。
我究竟做错了什么?
如果要拆分后跟 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.或的位置不能有空格-。
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |