Разделение строки с использованием регулярного выражения с предварительным утверждением

Вот строка:

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

or

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

Но регулярное выражение нигде не совпадает, и выводится исходная строка.

Что я делаю не так?


person ephemeris    schedule 28.12.2015    source источник
comment
Укажите dput() вашей строки.   -  person    schedule 28.12.2015


Ответы (1)


Если вы хотите разделить пробелы, за которыми следует - или ., вам нужно использовать просмотр вперед после, когда вы найдете пробел.

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" 

Это работает, потому что просмотр вперед имеет нулевую ширину, что означает, что он фактически не использует эти символы и не перемещается вперед от начальной позиции совпадения. Вы остаетесь прямо в начале совпадения, что позволяет вам снова сопоставлять те же пробелы вне просмотра вперед.


Ваш первоначальный подход не работает из-за характера просмотра вперед с нулевой шириной. По сути, вы просите просмотреть текущую позицию, не продвигаясь вперед, чтобы увидеть, есть ли . или -. Затем, если они найдены, поищите в том же месте одно или несколько мест. В том месте, где вы нашли . или -, не может быть пробела.

person Jota    schedule 28.12.2015