Я работаю в R с очень запутанными адресными данными и смог решить все проблемы, кроме одной. В конце адресной строки, где находится почтовый индекс, часто есть 1, 2 или 3 дополнительные цифры, которые мне нужно удалить (если они присутствуют). Я не могу просто подстрочить поле, поскольку количество конечных цифр варьируется, поэтому, похоже, мне нужно решение для регулярного выражения.
Вот несколько примеров того, как адреса выглядят на данный момент:
"3660 Nogales St West Covina, CA, 9179266"
"6666 W Peoria Ave #106 Glendale, AZ, 85302174"
"10391 Friars Rd San Diego, CA, 9212051"
"7950 E Mississippi Ave Suite F Denver, CO, 8024766"
"1079 S Federal Blvd Denver, CO, 8021956"
"1420 Saratoga Ave San Jose, CA, 9512948"
Я попробовал несколько вещей, которые привели к неожиданным результатам. Самая последняя попытка, которая, как я думал, сработает, — это жадное сопоставление запятых и извлечение 5 цифр, следующих за последней группой запятых.
Это код, который я использовал:
str_extract_all(df$address, "^\\w+(?:,\\w+)*,\\d{5}"), но это превращает строку в character(0), хотя я ожидал, что она вернет адреса за вычетом конечных цифр. Итак, я ожидаю, что проблема связана с кодом, а не с самим решением.
Я все еще изучаю регулярные выражения и считаю себя новичком, поэтому, возможно, я делаю банальную ошибку или упускаю функцию, которая имеет решающее значение для работы кода. Любая помощь очень ценится!
Альтернативно, сопоставьте ^.*(?<=\b\d{5})(?=\d*\s*$). Это регулярное выражение гласит: «Соответствует любому количеству символов в начале строки (^.*), при условии, что последние пять символов представляют собой цифры, которым предшествует граница слова ((?<=\b\d{5})), и за ними следуют ноль или более цифр, за которыми следует ноль или более пробелов в позиции конец строки ((?=\d*\s*$)), (?=...) — положительный прогноз Демо.
Спасибо! Это полезно, особенно для понимания того, как именно работает логика просмотра назад/упреждения.





Использование группы захвата с sub
sub("(, \\D{2}, \\d{5}).*$", "\\1", dat)
[1] "3660 Nogales St West Covina, CA, 91792"
[2] "6666 W Peoria Ave #106 Glendale, AZ, 85302"
[3] "10391 Friars Rd San Diego, CA, 92120"
[4] "7950 E Mississippi Ave Suite F Denver, CO, 80247"
[5] "1079 S Federal Blvd Denver, CO, 80219"
[6] "1420 Saratoga Ave San Jose, CA, 95129"
с str_replace
library(stringr)
str_replace(dat, "\\d+$", \(x) substr(x, 1, 5))
[1] "3660 Nogales St West Covina, CA, 91792"
[2] "6666 W Peoria Ave #106 Glendale, AZ, 85302"
[3] "10391 Friars Rd San Diego, CA, 92120"
[4] "7950 E Mississippi Ave Suite F Denver, CO, 80247"
[5] "1079 S Federal Blvd Denver, CO, 80219"
[6] "1420 Saratoga Ave San Jose, CA, 95129"
Рабочий подход str_extract похож на базовый R sub.
str_extract(dat, ".*, \\D{2}, \\d{5}")
dat <- c("3660 Nogales St West Covina, CA, 9179266", "6666 W Peoria Ave #106 Glendale, AZ, 85302174",
"10391 Friars Rd San Diego, CA, 9212051", "7950 E Mississippi Ave Suite F Denver, CO, 8024766",
"1079 S Federal Blvd Denver, CO, 8021956", "1420 Saratoga Ave San Jose, CA, 9512948"
)
Спасибо! Это сработало отлично, а также помогло мне получить ценную информацию, которую я могу использовать в дальнейшем. Очень признателен.
Просто преобразуйте совпадения регулярного выражения
(?<=\b\d{5})\d+$в пустые строки. Возможно, вам придется указатьperl=TRUE. Регулярное выражение гласит: «Соответствует одной или нескольким цифрам в конце строки (\d+$) при условии, что ей предшествуют пять цифр (\d{5}), которым предшествует граница слова (\b),(?<=...)является положительным просмотром назад. Демо