Регулярное выражение: извлечь строку между двумя символами / строками - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть формула модели (в виде строки) и я хочу извлечь значение для определенного аргумента, id в моем случае.Теперь я нашел способ, который возвращает строку без нужного строкового значения.Я хочу с точностью до наоборот, я только хочу, чтобы в моем результате отсутствовало строковое значение:

xx <- "gee(formula = breaks ~ tension, id = wool, data = warpbreaks)"
sub("(?=(id=|id =))([a-zA-Z].*)(?=,)", "\\1", xx, perl =T)
#> [1] "gee(formula = breaks ~ tension, id =, data = warpbreaks)"

wool отсутствует в возвращаемом значении, но я хочу только иметьwool как полученная строка ... Может кто-нибудь помочь мне найти правильный шаблон регулярных выражений?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Вместо регулярного выражения вы можете parse() строку и получить аргумент id по имени.

as.character(parse(text = xx)[[1]]$id)
# [1] "wool"
0 голосов
/ 10 февраля 2019

Вы можете использовать

xx <- "gee(formula = breaks ~ tension, id = wool, data = warpbreaks)"
sub(".*\\bid\\s*=\\s*(\\w+).*", "\\1", xx)
## or, if the value extracted may contain any chars but commas
sub(".*\\bid\\s*=\\s*([^,]+).*", "\\1", xx)

См. Демо R и демо regex .

Подробности

  • .* - любые 0+ символов, как можно больше
  • \\bid - целое слово id (\b - граница слова)
  • \\s*=\\s* - =, заключенный в 0+ пробелов
  • (\\w+) - Группа захвата 1 (\\1 в шаблоне замены относится к этому значению): одна или несколько букв, цифр или подчеркиваний(или [^,]+ соответствует 1 + символам, отличным от запятой)
  • .* - остаток строки.

Другие альтернативные решения:

> xx <- "gee(formula = breaks ~ tension, id = wool, data = warpbreaks)"
> regmatches(xx, regexpr("\\bid\\s*=\\s*\\K[^,]+", xx, perl=TRUE))
[1] "wool"

Шаблон соответствует id, =, заключенному в 0+ пробелов, затем \K пропускает сопоставленный текст и только 1+ символов, отличных от ,, попадают в значение совпадения.

Или,подход захвата с stringr::str_match также действителен здесь:

> library(stringr)
> str_match(xx, "\\bid\\s*=\\s*([^,]+)")[,2]
[1] "wool"
...