Сложность в этом вопросе заключается в формулировании регулярного выражения, которое может выборочно удалять все каналы, кроме тех, которые мы хотим оставить в качестве фактических разделителей между терминами. Мы можем сопоставить по следующей схеме:
\|\s+(?=\|)
и затем заменить просто пустую строку. Этот шаблон удалит любую трубу (и любые последующие пробелы) до тех пор, пока последующая будет другой трубой. Удаление будет , а не , когда за каналом будет следовать фактический термин или после него будет конец строки.
badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"
result <- gsub("\\|\\s+(?=\\|)", "", badstring, perl=TRUE)
result
[1] "| GHOULSBY,SCROGGINS | CAT,JOHNSON | BURGLAR,PALA |"
Демо
Edit:
Если вы ожидаете, что будут входные данные, подобные | | |
, которые не содержат никаких терминов, и вы ожидаете, что в качестве выходных данных будет пустая строка, то мое решение будет неудачным. Я не вижу очевидного способа изменить приведенное выше регулярное выражение, но вы можете обработать этот случай с помощью еще одного вызова sub
:
result <- sub("^\\|$", "", result)
Мы также можем изменить исходный шаблон для использования чередования, охватывающего все случаи:
result <- gsub("\\|\\s+(?=\\|)|(?:^\\|$)", "", badstring, perl=TRUE)