import re
preposition_lst = [ 'DE LO ' , 'DE LA ' , 'DE LAS ' , 'DEL ' , 'DELS ' , 'DE LES ' , 'DO ' , 'DA ' , 'DOS ' , 'DAS' , 'DE ' ]
cases = [ "DE BLAS ZAPATA" , "MATIAS DE LA MANO" , "LOPEZ FERNANDEZ DE VILLAVERDE" , "DE MIGUEL DEL CORRAL" , "VIDAL DE LA PEÑA" , "MONTAVA DEL ARCO" , "DOS CASAS VALLE" ]
preps = r'(?:D(?:AS?|E(?:[ ]L(?:AS?|ES|O)|LS?)?|OS?) )?'
pattern = fr'^({preps}[^\W \d _]+)( {preps}[^\W \d _]+)?( de {preps}[^\W \d _]+)?$'
for case in cases:
m = re .search ( pattern, case, re .I ) # re.I makes it case insensitive
if m:
print ( [ x.strip ( ) for x in m.groups ( ) if x] )
else :
print ( f"No match for {case}" )
aW1wb3J0IHJlCgpwcmVwb3NpdGlvbl9sc3QgPSBbJ0RFIExPICcsICdERSBMQSAnLCAnREUgTEFTICcsICdERUwgJywgJ0RFTFMgJywgJ0RFIExFUyAnLCAnRE8gJywgJ0RBICcsICdET1MgJywgJ0RBUycsICdERSAnXQpjYXNlcyA9IFsiREUgQkxBUyBaQVBBVEEiLCAiTUFUSUFTIERFIExBIE1BTk8iLCAiTE9QRVogRkVSTkFOREVaIERFIFZJTExBVkVSREUiLCAiREUgTUlHVUVMIERFTCBDT1JSQUwiLCAiVklEQUwgREUgTEEgUEXDkUEiLCAiTU9OVEFWQSBERUwgQVJDTyIsICJET1MgQ0FTQVMgVkFMTEUiXQoKcHJlcHMgPSByJyg/OkQoPzpBUz98RSg/OlsgXUwoPzpBUz98RVN8Tyl8TFM/KT98T1M/KSApPycKcGF0dGVybiA9IGZyJ14oe3ByZXBzfVteXFdcZF9dKykoIHtwcmVwc31bXlxXXGRfXSspPyggZGUge3ByZXBzfVteXFdcZF9dKyk/JCcKZm9yIGNhc2UgaW4gY2FzZXM6CiAgICBtID0gcmUuc2VhcmNoKHBhdHRlcm4sIGNhc2UsIHJlLkkpICMgcmUuSSBtYWtlcyBpdCBjYXNlIGluc2Vuc2l0aXZlCiAgICBpZiBtOgogICAgICAgIHByaW50KFt4LnN0cmlwKCkgZm9yIHggaW4gbS5ncm91cHMoKSBpZiB4XSkKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoZiJObyBtYXRjaCBmb3Ige2Nhc2V9Iik=
stdout
['DE BLAS', 'ZAPATA']
['MATIAS', 'DE LA MANO']
['LOPEZ', 'FERNANDEZ', 'DE VILLAVERDE']
['DE MIGUEL', 'DEL CORRAL']
['VIDAL', 'DE LA PEÑA']
['MONTAVA', 'DEL ARCO']
['DOS CASAS', 'VALLE']