2016-04-07 3 views
0

Мне нужно найти экземпляры команды LaTeX \ index в целом наборе документов knitr (.Rnw), в которых есть запятые. Они могут встречаться на нескольких линиях, например.Многострочные регулярные выражения в R

\index{prior distribution,choosing beta prior for 
$\pi$,vague prior knowledge} 

Я достаточно доволен своей R код, чтобы найти вещи:

line = paste(readLines(input), collapse = "\n") 
r = gregexpr(pattern, line) 

if(length(r) > 0){ 
    lapply(regmatches(line, r), function(e){cat(paste(substr(e, 0, 50), "\n"))}) 
} 

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

pattern = "(\\s)\\\\index\\{.*[,][^}]*\\}" 

который получает некоторые, но не все,

pattern = "\\\\index\\{[A-Za-z \\s][^}]*\\}" 

, который получает больше, но много я не хочу. Например, он находит

\index{posterior variance!beta distribution} 

Любая помощь оценивается.

+0

Это помогло бы, если бы у вас был большой набор вещей, чтобы соответствовать или нет в вашем примере. Независимо от того, существует многострочный флаг '(? M)', вы можете установить в perl-подобном регулярном выражении. Что-то вроде 'pattern =" (? M)^\\\\ index \\ {. * [,] [^}] * \\} "'? Вам нужно установить 'perl = TRUE' в' gregexpr'. – alistaire

ответ

1

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

library(stringr) 
t = "\\index{prior distribution,choosing beta prior for 
    \\$\\pi\\$,vague prior knowledge} bleh 
\\index{posterior variance!beta distribution}" 
cat(t) 

tier_1 = str_match_all(t, "(?s)\\index\\{.*?\\}")[[1]] 
tier_2 = tier_1[str_detect(tier_1, ",")] 

Первое регулярное выражение находит все \ индекс {} вещи, across lines. Второй хранит только те, у которых есть запятая.

Это первое, а не второе. Вы можете добавить больше уровней, чтобы отсортировать файлы, которые вам не нужны.

+0

Спасибо @Deleet. Используя второй паттерн 'pattern =" \\\\ index \\ {[A-Za-z \\ s] [^}] * \\} "сделал трюк –

Смежные вопросы