Я хочу написать регулярное выражение в R, чтобы удалить все слова строки, содержащей числа

#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"