If you need to use a regex for this :
regex = re.compile('(?P<before_red_car>.+) a red car')
regex.search("What i want is a red car").group('before_red_car')
If you don't want to name your group :
regex = re.compile('(.+)a red car')
regex.search("What i want is a red car").group(1)
If you need to catch everything including newlines, add the re.DOTALL
flag.
However, doing
text = 'What I want is a red car'
text.split('a red car')[0]
Or even :
text = 'What I want is a red car'
text.replace('a red car', '')
Work too, and are arguably easier to understand.
They are also twice faster :
timeit.timeit(lambda: text.split('a red car')[0])
0.5350678942020507
timeit.timeit(lambda: text.replace('a red car', ''))
0.5115460171814448
timeit.timeit(lambda: regex.search("What i want is a red car").group(1))
1.123993800741033
# Without re.compile()
timeit.timeit(lambda: re.search('(.+)a red car', text).group(1))
1.94518623436079