Разбить строку R на пробелы, но не на пробел между одинарными кавычками - PullRequest
2 голосов
/ 18 марта 2020

У меня есть и уродливый и сложный набор строк, которые мне нужно разделить:

vec <- c("'01'", "'01' '02'", 
         "#bateau", "#bateau #batiment",
         "#'autres 32'", "#'autres 32' #'batiment 30'", "#'autres 32' #'batiment 30' #'contenu 31'",
         "#'34'", "#'34' #'33' #'35'")
vec
[1] "'01'"                                      "'01' '02'"                                
[3] "#bateau"                                   "#bateau #batiment"                        
[5] "#'autres 32'"                              "#'autres 32' #'batiment 30'"              
[7] "#'autres 32' #'batiment 30' #'contenu 31'" "#'34'"                                    
[9] "#'34' #'33' #'35'" 

Мне нужно разделить строку везде, где есть пробел (), за исключением случаев, когда пробел находится между '. Таким образом, в приведенном выше примере '01' '02' станет '01' и '02', а #'autres 32' #'batiment 30' станет #'autres 32' и #'batiment 30'.

Я пытался получить вдохновение от этого вопроса , но далеко не ушел:

strsplit(vec, "(\\s[^']+?)('.*?'|$)")

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

Результат от разделения должно быть что-то вроде:

res <- c("'01'", "'01'", "'02'", 
         "#bateau", "#bateau", "#batiment",
         "#'autres 32'", "#'autres 32'", "#'batiment 30'", "#'autres 32'", "#'batiment 30'", "#'contenu 31'",
         "#'34'", "#'34'", "#'33'", "#'35'")

Каким будет правильное регулярное выражение для разбиения этой строки?

Спасибо

1 Ответ

4 голосов
/ 18 марта 2020

Вы можете использовать

strsplit(vec, "'[^']*'(*SKIP)(*F)|\\s+", perl=TRUE)

См. Демо R и демо regex онлайн.

Подробнее

  • '[^']*'(*SKIP)(*F) - ', затем любые 0+ символов, кроме ' (см. [^']*) и затем ', а затем этот сопоставленный текст отбрасывается и следующее совпадение ищется из позиции, где текущее совпадение не удалось (см. (*SKIP)(*F))
  • | - или
  • \s+ - 1+ пробельных символов.

Поскольку это шаблон PCRE, perl=TRUE является обязательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...