Вы можете использовать подход замены:
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)
- сразу справа должен быть пробел или конец строки.Мы могли бы использовать gsub
для сопоставления букв, цифр, от границы слова (\\b
) до следующего и заменить пробелом (""
)
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"
Вы можете использовать gsub
, чтобы заменить символы, начиная с первого пробела (" "
) до последнего пробела, одним пробелом.
x <- "Saint A/74/PV.46 12/12/2019 4/66 19-40538 Lucia"
gsub(" .+ ", " ", x)
[1] "Saint Lucia"