выражения str_extract в R - PullRequest
       66

выражения str_extract в R

0 голосов
/ 30 июня 2019

Я хотел бы преобразовать это:

AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1

к этому:

ELA-3

Я попробовал эту функцию:

str_extract(.,pattern = ":?(ELA).*(\\d\\-)"))

напечатано это:

"ELA-NH-COMBINED-3-"

Мне нужно избавиться от текста или чего-либо между двумя выдержками. Число будет числом от 3 до 9. Как мне изменить выражение в pattern =? Спасибо!

Ответы [ 2 ]

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

1) Совпадение всего до -ELA, за которым следуют все (.*) до -, за которыми следуют захваченные цифры (\\d+), затем -, за которыми следует что угодно. Затем заменить с ELA-, за которым следуют захваченные цифры. Пакеты не используются.

x <- "AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1"
sub(".*-ELA.*-(\\d+)-.*", "ELA-\\1", x)
## [1] "ELA-3"

2) Другой подход, если существует только одно числовое поле, заключается в том, что мы можем прочитать в полях, выделить числовое поле и ввести его перед ELA-. Пакеты не используются.

s <- scan(text = x, what = "", quiet = TRUE, sep = "-")
paste("ELA", grep("^\\d+$", s, value = TRUE), sep = "-")
## [1] "ELA-3"
1 голос
/ 02 июля 2019

TL; DR;

Вы не можете сделать это с помощью одного вызова str_extract, поскольку вы не можете сопоставить отдельные фрагменты текста в одной операции сопоставления .

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

Обходы / Решения

Существует дварешения:

  • Захватывайте нужные вам части текста и затем соединяйте их (2 операции: match + join)
  • Захватите нужные вам части текста и замените их обратными ссылками на необходимые группы (1 replace* 1035)* операция)

Захват групп хранит только части текста, которые вы сопоставляете, в отдельных буферах памяти, но вам также нужен метод или функция, способнаядоступ к этим кускам.

Здесь, в R, str_extract отбрасывает их, но str_match сохраняет их в результате.

s <- "AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1"
m <- str_match(s, ":?(ELA).*-(\\d+)") 
paste0(m[,2], "-", m[,3])

Это печатает ELA-3.См. R demo online .

Другой способ - заменить во время захвата детали, которые необходимо сохранить, а затем использовать обратные ссылки на эти детали в шаблоне замены:

x <- "AIR-GEN-SUM-UD-ELA-NH-COMBINED-3-SEG1"
sub("^.*-ELA.*?-([^-]+)-[^-]+$", "ELA-\\1", x)

См. эту демонстрационную версию R

...