2015-07-12 3 views
2

Я пытаюсь сопоставить следующие упорядоченные и неупорядоченные списки и извлечь точку маркера/списка.В R, как мне сопоставлять список уценок

library(stringr) 
examples <- c(
"* Bullet 1\n* Bullet 2\n* Bullet 3", 
"1. Bullet 1\n2. Bullet 2\n3. Bullet 3", 
"* This is a test 1\n* This is a test with some *formatting*\n* This is a test with different _formatting_" 
) 

То, что я хотел бы сделать, это:

  1. Признать, что это список программно
  2. Анализировать каждый в только текст элемента списка

Результат будет

some_str_fun(example,pattern) # or multiples 
"Bullet 1" "Bullet 2" "Bullet 3" 
"Bullet 1" "Bullet 2" "Bullet 3" 
"This is a test 1" "This is a test with some *formatting*" 
"This is a test with different _formatting_" 

Я играл со следующими узорами и str_extract/матч, но не могу найти что-то полностью функциональный

[*]+\\s(.*?)[\n]* # for * Bullet X\n 
[1-9]+[.]\\s(.*?)[\n]* # for 1. Bullet X\n 

Я пробовал кучу разных итераций на этих скороговорки, но не вполне может показаться чтобы получить то, что я ищу.

+0

Возможно ли иметь «0»: например, '10. Bullet'? – Jota

+0

@Frank нет, я так не верю. –

ответ

1

Вот еще один вариант. Вы можете обернуть в unlist при желании:

str_extract_all(examples, "[^*1-9\n ]\\w+(?[\\w*]+)*") 
# or 
#str_extract_all(examples, "[^*1-9\n ]\\w+(?[a-zA-Z0-9_*]+)*") 

#[[1]] 
#[1] "Bullet 1" "Bullet 2" "Bullet 3" 
# 
#[[2]] 
#[1] "Bullet 1" "Bullet 2" "Bullet 3" 
# 
#[[3]] 
#[1] "This is a test 1"       
#[2] "This is a test with some *formatting*"  
#[3] "This is a test with different _formatting_" 

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

splits <- unlist(str_split(examples, "\n|\\d+\\. |\\* ")) 
splits[splits != ""] 
#[1] "Bullet 1"         
#[2] "Bullet 2"         
#[3] "Bullet 3"         
#[4] "Bullet 1"         
#[5] "Bullet 2"         
#[6] "Bullet 3"         
#[7] "This is a test 1"       
#[8] "This is a test with some *formatting*"  
#[9] "This is a test with different _formatting_" 
+0

Что происходит с конечными цифрами в первых пулях? –

+0

Регулярное выражение написано не соответствует тому, что вы предполагаете. – hwnd

+0

Вы обертываете начальную часть внутри отрицаемого символьного класса, вы не можете использовать конструкции группировки внутри класса. – hwnd

2

Это немного другой подход, но если вы оказать уценки в HTML вы можете использовать некоторые из существующих методов добычи, чтобы делать то, что вы хотите:

library(stringr) 

examples <- c(
"* Bullet 1\n* Bullet 2\n* Bullet 3", 
"1. Bullet 1\n2. Bullet 2\n3. Bullet 3", 
"* This is a test 1\n* This is a test with some *formatting*\n* This is a test with different _formatting_" 
) 

extract_md_list <- function(md_text) { 

    require(rvest) 
    require(rmarkdown) 

    fil_md <- tempfile() 
    fil_html <- tempfile() 
    writeLines(md_text, con=fil_md) 

    render(fil_md, output_format="html_document", output_file=fil_html, quiet=TRUE) 

    pg <- html(fil_html) 
    ret <- html_nodes(pg, "li") %>% html_text() 

    # cleanup 
    unlink(fil_md) 
    unlink(fil_html) 

    return(ret) 

} 

extract_md_list(examples) 

## [1] "Bullet 1"         
## [2] "Bullet 2"         
## [3] "Bullet 3"         
## [4] "Bullet 1"         
## [5] "Bullet 2"         
## [6] "Bullet 3"         
## [7] "This is a test 1"       
## [8] "This is a test with some formatting"  
## [9] "This is a test with different formatting" 
+0

Мне это нравится. Но я уже закодировал остальное прямо из Rmd (жирный курсив, графики, встроенный R). –

+0

существует _is_ причина 'pandoc' существует, но если вы сильно зависимы от регулярных выражений, вы можете использовать элемент https://gist.github.com/jbroadway/2836900, чтобы извлечь то, что вам нужно. это быстро и чисто. – hrbrmstr

+0

Pandoc не может запускать R-код. Или, по крайней мере, не я их знаю. –

3

Вы можете использовать strapply из gsubfn пакета, чтобы соответствовать всему шаблону.

library(gsubfn) 

examples <- c(
    "* Bullet 1\n* Bullet 2\n* Bullet 3", 
    "1. Bullet 1\n2. Bullet 2\n3. Bullet 3", 
    "* This is a test 1\n* This is a test with some *formatting*\n* This is a test with different _formatting_" 
) 

strapply(examples, '(?:\\*|\\d+\\.) *([^\n]+)', c, simplify = c) 

# [1] "Bullet 1"         
# [2] "Bullet 2"         
# [3] "Bullet 3"         
# [4] "Bullet 1"         
# [5] "Bullet 2"         
# [6] "Bullet 3"         
# [7] "This is a test 1"       
# [8] "This is a test with some *formatting*"  
# [9] "This is a test with different _formatting_"