String-splitting function
So the idea in this new approach is to write two expressions:


one that extracts the next expresstion:
(take-while #(not= "#ENTRY_END" %) 
                            (rest (drop-while #(not= "#ENTRY_START" %) data)))
one that extracts everything after the next expression
(rest (drop-while #(not= "#ENTRY_END" %) 
                        (rest (drop-while #(not= "#ENTRY_START" %) data))))


and then wrap them up into a lazy sequence:

first lets expand the test data to include some additional edge cases:

user&gt; (def test-data [
       "Header line"
       "#ENTRY_START"
       "entry line 1 "
       "entry line 2"
       "#ENTRY_END"
       "not part of an entry"
       "also not part of an entry"
       "#ENTRY_START"
       "entry line 1 "
       "entry line 2"
       "#ENTRY_END"
       "footer1"
       "footer2"])


then wrap our two expressions into a function:

user&gt; (defn entry-seq [data] 
        (let [f (take-while #(not= "#ENTRY_END" %) 
                            (rest (drop-while #(not= "#ENTRY_START" %) data))) 
              r (rest (drop-while #(not= "#ENTRY_END" %) 
                            (rest (drop-while #(not= "#ENTRY_START" %) data))))] 
      (when (not-empty f) (lazy-seq (cons f (entry-seq r))))))
#'user/entry-seq


and we test it:

user&gt; (take 4  (entry-seq test-data))
(("entry line 1 " "entry line 2") ("entry line 1 " "entry line 2"))