import re # Test the specific failing case test_text = 'FemaleBrookville HighMouse' pattern = r'^(Female|Male)(.+?)([A-Z][a-z]+)$' print(f"Testing: {test_text}") print(f"Pattern: {pattern}") match = re.match(pattern, test_text) if match: print("✅ MATCH!") print(f"Groups: {match.groups()}") print(f"Group 1 (gender): {match.group(1)}") print(f"Group 2 (school): {match.group(2)}") print(f"Group 3 (last_name): {match.group(3)}") else: print("❌ NO MATCH") # Let's try a more specific pattern print("\nTrying more specific pattern...") pattern2 = r'^(Female|Male)([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*\s+(?:High|School|Academy|Middle|Elementary))\s*([A-Z][a-z]+)$' match2 = re.match(pattern2, test_text) if match2: print("✅ MATCH with specific pattern!") print(f"Groups: {match2.groups()}") else: print("❌ NO MATCH with specific pattern") # Let's see what happens if we split on space parts = test_text.split() print(f"\nSplit on space: {parts}") # Let's try to manually parse it if test_text.startswith(('Female', 'Male')): gender = 'Female' if test_text.startswith('Female') else 'Male' remaining = test_text[len(gender):] print(f"Gender: {gender}") print(f"Remaining: {remaining}") # Look for school keywords school_keywords = ['High', 'School', 'Academy', 'Middle', 'Elementary'] for keyword in school_keywords: if keyword in remaining: keyword_pos = remaining.find(keyword) + len(keyword) school = remaining[:keyword_pos] last_name = remaining[keyword_pos:] print(f"School: {school}") print(f"Last name: {last_name}") break