R: регулярное выражение для соответствия более чем одному вхождению канала - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть набор данных, в который я вставляю значения в цепочку dplyr и сворачиваюсь с символом канала (например, "|"). Если любое из значений в наборе данных пустое, я просто получаю повторяющиеся символы канала в вставленном списке.

Некоторые значения выглядят так, например:

badstring = "| | | | | | GHOULSBY,SCROGGINS | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CAT,JOHNSON | | | | | | | | | | | | BURGLAR,PALA | | | | | | | | |"

Я хочу сопоставить все каналы, которые встречаются более одного раза, и удалить их, чтобы только имена выглядели так:

correctstring = "| GHOULSBY,SCROGGINS | CAT,JOHNSON | |BURGLAR,PALA |"

Я попробовал следующее, но безрезультатно:

mutate(names = gsub('[\\|]{2,}', '', name_list)) 

1 Ответ

0 голосов
/ 05 сентября 2018

Сложность в этом вопросе заключается в формулировании регулярного выражения, которое может выборочно удалять все каналы, кроме тех, которые мы хотим оставить в качестве фактических разделителей между терминами. Мы можем сопоставить по следующей схеме:

\|\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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...