2014-02-20 3 views
1

Я хотел бы разделить ряд строк на третьем пробеле справа. Количество строк пробелов варьируется между строками, но каждая строка имеет по крайней мере три пробела. Вот две примерные строки.Сплит-строки на третьем пробеле справа

strings <- c('abca eagh ijkl mnop', 'dd1 ss j, ll bb aa') 

Я хотел бы:

[1] 'abca', 'eagh ijkl mnop' 
[2] 'dd1 ss j,', 'll bb aa' 

Ближайший я смог прийти в:

strsplit(strings, split = "(?<=\\S)(?=\\s(.*)\\s(.*)\\s(.*)$)", perl = TRUE) 

, которая возвращает:

[[1]] 
[1] "abca"   " eagh"  " ijkl mnop" 

[[2]] 
[1] "dd1"  " ss"  " j,"  " ll bb aa" 

Я продолжаю думать ответ должно быть примерно так:

strsplit(strings, split = "(?<=\\S\\s(.*)\\s(.*)\\s(.*)$)(?=\\s(.*)\\s(.*)\\s(.*)$)", perl = TRUE) 

Однако, это возвращает ошибку. Спасибо за любой совет. Я предпочитаю решение в базе, надеюсь, тот, который использует регулярные выражения.

+0

Можете ли вы отменить свою строку, а затем разделить инвертированную строку на третьем белом поле слева (может быть, проще!), А затем перевернуть каждую подстроку? – Theox

+0

Не должен ли первый пример 'abca eagh {SPACE} {SPACE} {SPACE} ijkl {SPACE} mnop' дать вам' 'abca eagh ',' ijkl mnop'', исходя из ваших требований? – JonM

+0

@JonM Возможно, я неправильно использую термин «пустое пространство». Извини за это. Я включил строки и желаемые результаты. –

ответ

3

Попробуйте выражение:

(?=(?>\\s\\S*){3}$)\\s 

Edit: Используйте это выражение, если вы хотите последовательные пробельные символы, которые будут рассматриваться как «один» пробел:

(?=(?>\\s+\\S*){3}$)\\s 

Стоит отметить, что причину, по которой выражение вызывало ошибку, скорее всего, потому что большинство движков регулярных выражений не допускают переменные ширины lookbehinds. В вашем примере это будет квант * в lookbehind, нарушающий правила.

Получил это! Извините, я не был на 100% от того, как работает функция strsplit. Попробуйте это:

strsplit(strings, split = "(?=(?>\\s+\\S*){3}$)\\s", perl = TRUE) 

Вот пример вывод:

> strings <- c('abca eagh ijkl mnop', 'dd1 ss j, ll bb aa') 
> strsplit(strings, split = "(?=(?>\\s+\\S*){3}$)\\s", perl = TRUE) 
[[1]] 
[1] "abca"    "eagh ijkl mnop" 

[[2]] 
[1] "dd1 ss j," "ll bb aa" 
+0

Я получаю ошибки с обоими. Я использую R. Одна ошибка касается \ escape-символа. Использование \\ не разрешает все ошибки. –

+0

Хорошо, я обновил ответ. Я дал ему конкретный синтаксис R. – JonM

+0

Обновленный ответ возвращает два "" и ничего больше. –

1

Как об использовании следующего регулярного выражения: (\S*\s*\S*\s*\S*\s*)(.*)? См. http://regex101.com/r/lI7aA9

+0

Это возвращает ошибки. Я использую R, который, кажется, предпочитает \\ over \. Тем не менее, я все еще получаю ошибки после использования \\. –

Смежные вопросы