извлечь несколько шаблонов из строки - PullRequest
1 голос
/ 06 февраля 2020

У меня есть строка:

a <- ":amount_min: !ruby/object:BigDecimal 18:0.8e2 :operator_min: gt :amount_max: !ruby/object:BigDecimal 18:0.1e4 :operator_max: lt"

Я хотел бы восстановить ее как:

a <- "min: 80, max:1000"

где: 0.8e2 = 80 и 0.1e4 = 1000.

Как я могу сделать это с помощью регулярного выражения?

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Вот попытка использования простого регулярного выражения вместе с str_extract_all из пакета stringr,

library(stringr)

paste(str_extract_all(a, 'amount_min|amount_max', simplify = TRUE), 
      as.numeric(str_extract_all(a, '[0-9]\\.[0-9]e[0-9]', simplify = TRUE)), 
      sep = ':', collapse = ', ')

#[1] "amount_min:80, amount_max:1000"
0 голосов
/ 06 февраля 2020

Вот базовое решение R с использованием regmatches + gsub

res <- toString(gsub("amount_",
                     "",
                     paste(unlist(regmatches(a,gregexpr("amount_min:|amount_max:",a))),
                           as.numeric(unlist(regmatches(a,gregexpr("\\d+?\\.?\\d+e[+-]?\\d+",a)))))
                     )
                )

таким, что

> res
[1] "min: 80, max: 1000"
0 голосов
/ 06 февраля 2020

Одно решение, которое использует двоеточие перед числами:

a <- ":amount_min: !ruby/object:BigDecimal 18:0.8e2 :operator_min: gt :amount_max: !ruby/object:BigDecimal 18:0.1e4 :operator_max: lt"

find_pos   <- gregexpr(pattern = ":[[:digit:]]", text = a)
get_string <- gsub(pattern = ":", "", substring(a,first=find_pos[[1]],last=find_pos[[1]]+5))
final      <- paste("min: ", as.numeric(get_string[1]), ", max: ", as.numeric(get_string[2]))

У меня также есть жестко закодированный раствор:

first_split <- strsplit(a, "BigDecimal 18:" )

min_val <- strsplit(first_split[[1]][2], ":")[[1]][1]
max_val <- strsplit(first_split[[1]][3], ":")[[1]][1]

final <- paste("min: ", as.numeric(min_val), ", max: ", as.numeric(max_val))

Существуют другие решения для извлечения 0.8e2 , но это значение всегда можно перевести как as.numeric

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...