Обрезать строку в r из непоследовательно размещенного, дублированного символа - PullRequest
0 голосов
/ 23 июня 2018

Я имею дело с адресными данными, которые находятся в строках, и я хочу извлечь только почтовый индекс. Они последовательно находятся в конце строки, но могут иметь различную длину (например, «XXX XXX» или «XX XXX» или «XXXX XXX»). Кроме того, перед ними последовательно стоит «\ n», но это происходит несколько раз в строке. Я думаю, что идеальным решением было бы извлечь все данные, которые идут после последнего "\ n", но я не знаю, как это сделать! Я могу найти способы обрезать данные после определенного символа, но не в том случае, если этот символ появляется несколько раз.

Пример строки:

"22 Generic Road,\nNotville,\nFaketon,\nUnited Kingdom,\nAB1 2CD"

РЕДАКТИРОВАТЬ ДОБАВИТЬ: Мой обходной путь для этого состоит в том, чтобы приблизиться к нему в два этапа: во-первых, обрезать строку до последних 11 символов (чтобы обеспечить получение общего почтового индекса и \ n для всех столбцов); во-вторых, извлеките все символы, следующие за \ n. Но, по-видимому, это излишне громоздко.

1 Ответ

0 голосов
/ 23 июня 2018

Это то, что вы ожидаете. В этом случае есть много способов решить эту проблему, gsub - это один из способов, вы также можете использовать str_extract из stringr или gregexpr из Base R:

gsub("(.*)\n(\\w+\\s+\\w+)$","\\2", x)

Логика :

Выбор последнего буквенно-цифрового слова с помощью \ w, поскольку существует более одного, следовательно, используется жадный символ + (одно или несколько совпадений), поскольку он присутствует в конце предложения, используйте «$», чтобы заставить его работать, шаблон соответствия - это одно слово, разделенное пробелом, с другим, следовательно, есть два \ w + и одно \ s + для пробела.Оборачивание этих совпадений в группу захвата (с использованием скобок, они используются для захвата совпадения) и замена всего совпадения на эту группу захвата дает нам результат.


Использование stringr::str_extract

stringr::str_extract(x, "(\\w+\\s+\\w+)$")

Выход :

> gsub("(.*)\n(\\w+\\s+\\w+)$","\\2", x)
[1] "AB1 2CD"

Входные данные:

x <- "22 Generic Road,\nNotville,\nFaketon,\nUnited Kingdom,\nAB1 2CD"
...