#r #regex #gsub #stringr
#r #регулярное выражение #gsub #stringr
Вопрос:
Например:
x<-"Saint A/74/PV.46 12/12/2019 4/66 19-40538 Lucia"
Должно дать мне «Сент-Люсию».
Я попытался
trimws(gsub("\w*[0-9] \w*\s*", "", x))
что дало мне
Saint A//PV.///-Lucia
Любая помощь была бы очень признательна.
Ответ №1:
Мы могли бы использовать gsub
для сопоставления букв, цифр, от границы слова ( \b
) до следующего и заменить на blank ( ""
)
gsub("\s{2,}", " ", gsub("\b[A-Z/0-9.-] \b", "", x))
#[1] "Saint Lucia"
Или с помощью str_extract
library(stringr)
str_c(str_extract_all(x, "(?<= |^)[[:alpha:]] (?= |$)")[[1]], collapse = " ")
#[1] "Saint Lucia"
Ответ №2:
Вы можете использовать подход замены:
x<-"Saint A/74/PV.46 12/12/2019 4/66 19-40538 Lucia"
gsub("\s*(?<!\S)(?!\p{L} (?!\S))\S ", "", x, perl=TRUE)
## => [1] "Saint Lucia"
library(stringr)
str_replace_all(x, "\s*(?<!\S)(?!\p{L} (?!\S))\S ", "")
## => [1] "Saint Lucia"
Смотрите демонстрацию R. Смотрите демонстрацию регулярных выражений. Подробные сведения:
s*
— ноль или более пробелов(?<!S)
— начало строки или позиции, которой непосредственно предшествует пробел(?!p{L} (?!S))
— следующий фрагмент без пробелов не может быть буквенным словомS
— один или несколько символов, не содержащих пробелов.
Или вы можете сопоставить все слова, содержащие только буквы, между пробелами и соединить совпадения с пробелом:
paste(unlist(regmatches(x, gregexpr("(?<!\S)\p{L} (?!\S)", x, perl=TRUE))), collapse=" ")
Смотрите демонстрацию R онлайн. Кроме того, посмотрите Демонстрацию регулярных выражений, она соответствует
(?<!S)
— позиция в начале строки или сразу после пробелаp{L}
— одна или несколько букв Юникода(?!S)
— сразу справа должен быть пробел или конец строки.
Ответ №3:
Вы могли бы использовать gsub
для замены символов, начиная с первого пробела ( " "
) до последнего пробела, одним пробелом.
x <- "Saint A/74/PV.46 12/12/2019 4/66 19-40538 Lucia"
gsub(" . ", " ", x)
[1] "Saint Lucia"