#r #regex
#r #регулярное выражение
Вопрос:
У меня есть это регулярное выражение для отделения букв от цифр (и символов) слова: (?<=[a-zA-Z])(?=([[0-9]|[:punct:]]))
. Моя тестовая строка: "CALLE15 CRA22"
.
Я хочу применить это регулярное выражение только к первому слову этого предложения (слово определяется пробелами). А именно, я хочу применить это только к "CALLE15"
.
Одним из решений является разделение строки (предложения) на слова, а затем применение регулярного выражения к первому слову, но я хочу сделать все в одном регулярном выражении. Другим решением является использование r, stringr::str_replace() (or sub())
которое заменяет только первое совпадение, но мне нужно stringr::str_replace_all (or gsub())
по другим причинам.
Что мне нужно, так это вставить пробел между двумя, что я делаю с помощью функции замены. Результат, которого я хочу, это "CALLE 15 CRA22"
и с возможностью "CALLE15 CRA 22"
. Я пробую много позиций для пробела и ничего, ни ^
в начале.
https://rubular.com/r/7dxsHdOA3avTdX
Спасибо за вашу помощь!!!!
Комментарии:
1. «Результат, которого я хочу, это
"CALLE 15 CRA22"
и с возможностью"CALLE15 CRA 22"
» Я в замешательстве. Вы подчеркиваете, что хотите применить регулярное выражение только к первому слову, но затем все равно хотите (необязательно?) применять это регулярное выражение ко второму слову? Можете ли вы пояснить? Я также не понимаю, что вы подразумеваете под необходимостью использоватьstr_replace_all
«по другим причинам».2. Возможность (извинения за тип) выбирать, к какому слову я применяю это регулярное выражение (к первому или второму слову). Но это всего лишь вариант. Я использую str_replace_all для таких случаев,
"CALLE15A20 CRA22"
когда желаемый результат равен"CALLE 15A 20 CRA22"
. Это адреса в моей стране.3. Я все больше и больше запутываюсь. Как
"CALLE15A20 CRA22"
становится"CALLE 15A 20 CRA22"
? Это сильно отличается от примера, который вы приводите в своем основном сообщении. Каковы правила разделения первого слова на три части? Я не понимаю, что вы подразумеваете под «Возможностью […] выбирать, к какому слову я применяю это регулярное выражение» ; итак, вам нужна какая-то функция с параметром, который выбирает слово?4. Прошу прощения за неясность. Последний пример был бесполезен. Общее правило состоит в том, чтобы группировать буквы с буквами, цифры с цифрами и т.д. И разделять их пробелами. Каждый из них, за исключением символов, представляет собой отдельное поле в адресе: от
CLL.6 N 5-74NORTE
доCLL . 6 N 5 - 74 NORTE
. Поскольку существует очень много исключений, мой подход заключался в том, чтобы разрешить это «слово» с помощью «word»: сначала исправьтеCLL.6
toCLL . 6
наCLL
(поле типа дороги) и6
(поле номера улицы) и т.д. Это привело меня к вопросу заголовка: отделитеCLL.6
или первое слово, не изменяя остальноеN 5-74NORTE
.5. Большое вам спасибо за ваше время, ваше терпение и вашу помощь!.
Ответ №1:
Я не уверен в вашей постановке проблемы (см. Мой комментарий выше), но следующее воспроизводит ваш ожидаемый результат и использует str_replace_all
ss <- "CALLE15 CRA22"
library(stringr)
str_replace_all(ss, "^([A-Za-z] )(\d )(\s. )$", "\1 \2\3")
#[1] "CALLE 15 CRA22"
Обновить
Чтобы воспроизвести вывод примерной строки из комментария выше
ss <- "CLL.6 N 5-74NORTE"
pat <- c(
"(?<=[A-Za-z])(?![A-Za-z])",
"(?<![A-Za-z])(?=[A-Za-z])",
"(?<=[0-9])(?![0-9])",
"(?<![0-9])(?=[0-9])")
library(stringr)
str_split(ss, sprintf("(%s)", paste(pat, collapse = "|"))) %>%
unlist() %>%
.[nchar(trimws(.)) > 0] %>%
paste(collapse = " ")
#[1] "CLL . 6 N 5 - 74 NORTE"