import re snap = '''- heading "Welcome" [level=1, ref=e3] - textbox "Username" [required, ref=e9] - link "Forgot Your Username?" [ref=e4] - button "Next" [ref=e7] - region "SARS AI Assistant Chat" [ref=e1] - button "Open SARS AI Assistant Chat" [expanded=false, ref=e2]''' def find_ref(snap, role, name=None): if name is None: pattern = rf"\b{re.escape(role)}\b[^\n]*?[,]?\s*ref=(e\d+)\]" else: pattern = ( rf"\b{re.escape(role)}\b[^\n]*?['\"]({re.escape(name)})['\"][^\n]*?" rf"[,]?\s*ref=(e\d+)\]" ) m = re.search(pattern, snap, re.MULTILINE) if m: return m.group(2) if m.lastindex and m.lastindex >= 2 else m.group(1) return None # Test all cases = [ ('textbox', 'Username', 'e9'), ('button', 'Next', 'e7'), ('link', 'Forgot Your Username?', 'e4'), ('heading', 'Welcome', 'e3'), ('region', 'SARS AI Assistant Chat', 'e1'), ('button', 'Open SARS AI Assistant Chat', 'e2'), (None, 'e9'), # role-only ] for c in cases: if c[0] is None: continue role, name, want = c got = find_ref(snap, role, name) ok = 'OK' if got == want else 'FAIL' print(f'{ok} find_ref({role!r}, {name!r}) = {got!r} (want {want!r})') # Role-only got = find_ref(snap, 'button', 'Next') # works print('role+name:', got)