Применять регулярное выражение только к первому слову фразы (определяемой пробелами)

#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 to CLL . 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"