2015-01-11 4 views
3

Я хочу извлечь информацию из серии файлов R .Rd. Я хочу примеры (хотя это может быть любой тег tex) и вы хотите извлечь между тегом левого текса и закрывающей фигурной скобкой. Я хочу также захватить закрывающиеся фигурные скобки, которые каким-то образом ускользнули ([}] или \\}, или каким-либо образом я не задумываюсь).Regex-grab между: правая граница не экранирована

Так вот у меня есть образец и моя попытка извлечь, но он захватывает только ДО первого спасся фигурную скобку:

## fake tex 
x <- "Here we go \\example{ x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n}\n\\end{here}" 

## regex to extract 
regmatches(x, gregexpr("(?<=\\\\example\\{)([^}]*)(?=\\})", x, perl = TRUE)) 

Выходной ток

[[1]] 
[1] " x <- 6\ngsub(\"\\" 

требуемый выход

" x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n" 

ответ

1

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

x <- gsub("\\\\}","\001",x) 
x <- gsub("\\[}\\]","\002",x) 
match <- regmatches(x, gregexpr("(?<=\\\\example\\{)([^}]*)(?=\\})", x, perl = TRUE)) 
match <- gsub("\001","\\\\}",match) 
match <- gsub("\002","[}]",match) 

Это дает

> match 
[1] " x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n" 
+0

Хорошее мышление. Я посмотрю, если другие придумают дополнительные ответы или критические замечания к этому подходу. +1 –

+0

Было бы здорово, если бы существовал способ фактически совместить то, что вы хотите, в одном вызове регулярного выражения без каких-либо обходов ... – Stibu

0

Ниже дается желаемый результат, по крайней мере, на примере, который вы указали:

> gsub(".+example\\{(.+)}.+","\\1",x) 
[1] " x <- 6\ngsub(\"\\}\", \"\", x, perl=TRUE)\ngsub(\"[}]\", \"\", x, perl=TRUE)\n" 
Смежные вопросы