Как сохранить только вхождения, которые заканчиваются конкретной буквой? - PullRequest
1 голос
/ 02 июня 2019

Я хотел бы сохранить все вхождения, которые заканчиваются только определенной буквой (скажем, «а») из строки. Я имею в виду не вектор, состоящий из разных элементов, а строку, вхождения которой разделены пробелами.

Вот данные:

 have="5a 4a 8a 10a 3a 5m 10m 7a 8p 11s 5s 4h 24h"
 want="5a 4a 8a 10a 3a 7a"

Вот несколько кодов:

gsub("([A-Z]|[0-9])([m|p|h|s])","", have)
gsub("\\w+m|p|h|s *", "", have)

После применения одного из этих кодов gsub я получаю 2 типа информации (буквенно-цифровая, за которой следует "a" и только цифры).

Но мне все еще нужно очистить, поэтому я получаю только вхождения, заканчивающиеся на "а". Какое у тебя есть представление?

Ответы [ 4 ]

3 голосов
/ 02 июня 2019

Вы можете сделать:

  trimws(gsub("([A-Z]|[0-9]{1,})([b-z])","",have))
[1] "5a 4a 8a 10a 3a   7a"

Чтобы удалить лишнее пространство:

gsub("\\s{2,}"," ",
      trimws(gsub("([A-Z]|[0-9]{1,})([b-z])","",have)))
#[1] "5a 4a 8a 10a 3a 7a"
2 голосов
/ 02 июня 2019

Или, гораздо более длинное, но более простое регулярное выражение, превратить его в вектор, а затем снова превратить в строку.

have_string <- "5a 4a 8a 10a 3a 5m 10m 7a 8p 11s 5s 4h 24h"
have_vector <- unlist(strsplit(have_string," "))
library(stringr)
want_vector <- have_vector[str_detect(have_vector, ".*?a$")]
want_string <- paste(want_vector, sep = " ", collapse = " ")
2 голосов
/ 02 июня 2019

Вы можете разбить его на слова, использовать grep, чтобы определить слова, оканчивающиеся на a, а затем вставить их обратно вместе.

Words = strsplit(have, "\\W+")[[1]]
paste(grep("a$", Words, value=T), collapse=" ")
[1] "5a 4a 8a 10a 3a 7a"
2 голосов
/ 02 июня 2019

Вы можете использовать этот шаблон и заменить его пустой строкой:

[ ]?[a-z0-9]+[mphs]
  • [ ]? Дополнительное пространство (квадратные скобки только для ясности)
  • [a-z0-9]+ Класс персонажа, соответствует 1+ раз a-z 0-9
  • [mphs] Класс символов, соответствует m, p h или s

Например

have="5a 4a 8a 10a 3a 5m 10m 7a 8p 11s 5s 4h 24h"
gsub(" ?[a-z0-9]+[mphs]","", have)

Результат

[1] "5a 4a 8a 10a 3a 7a"

Regex demo | R демо

Возможно, вы могли бы сопоставить их вместо:

\b\da\b
  • \b Граница слова
  • \d цифра
  • a соответствует
  • \b Граница слова

Regex demo

Обратите внимание, что в классе символов [m|p|h|s] | означает не or, а | символ и может также записываться как [mphs|].

...