I would like to return all strings within the specified starting and end strings.
Given a string libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'.
From the above libs string I would like to search for strings that are in between libr( and ) or the string between req( and ).
I would like to return ['lib1', 'lib2', 'lib3', 'reqlib']
import re
libs = 'libr(lib1), libr(lib2), libr(lib3), req(reqlib), libra(nonlib)'
pat1 = r'libr+((.*?))'
pat2 = r'req+((.*?))'
pat = f"{pat1}|{pat2}"
re.findall(pat, libs)
The code above currently returns [('lib1', ''), ('lib2', ''), ('lib3', ''), ('', 'reqlib')] and I am not sure how I should fix this.
Advertisement
Answer
Try this regex
(?:(?<=libr()|(?<=req())[^)]+
Explanation:
(?:(?<=libr()|(?<=req())(?<=libr()– positive lookbehind that matches the position which is immediately preceded by textlibr(|– or(?<=req()– positive lookbehind that matches the position which is immediately preceded by textreq(
[^)]+– matches 1+ occurrences of any character which is not a). So, this will match everything until it finds the next)