Find shortest matches between two strings

python, regex

Solution

This regex should match what you want:

(start((?!start).)*?end)

Use `re.findall` method and single-line modifier `re.S` to get all the occurences in a multi-line string:

re.findall('(start((?!start).)*?end)', text, re.S)

See a test here.

Problem

I have a large log file, and I want to extract a multi-line string between two strings: `start` and `end`. The following is sample from the `inputfile`: ``` start spam start rubbish start wait for it... profit! here end start garbage start second match win. end ``` The desired solution should print: ``` start wait for it... profit! here end start second match win. end ``` I tried a simple regex but it returned everything from `start spam`. How should this be done? Edit: Additional info on real-life computational complexity: - actual file size: 2GB - occurrences of 'start': ~ 12 M, evenly distributed - occurences of 'end': ~800, near the end of the file.

Original source

Related problems