import re
text= [ 'one two three basic' , '1 2 3 basic' , '1st 2nd 3rd basic' ,
'one two three very basic' , '1 2 3 very basic' , '1st 2nd 3rd very basic' ]
num_list= [ 'one' , 'two' , 'three' ]
keywords = [ 'basic' , 'main' , 'foundations' ]
dgt_part = r'\d +(?:st|[rn]d|th)?'
num_wrd_part = '(?:{})' .format ( '|' .join ( num_list) )
kwd_part = '|' .join ( keywords)
rx = re .compile ( r'\b (?=({0}(?:\s +{0})*|{1}(?:\s +{1})*))\1 (?!\s +(?:{2})\b )\s *' .format ( dgt_part, num_wrd_part, kwd_part) , re .I )
print ( rx.pattern )
for element in text:
print ( rx.sub ( '' , element) )
aW1wb3J0IHJlCgp0ZXh0PVsnb25lIHR3byB0aHJlZSBiYXNpYycsICcxIDIgMyBiYXNpYycsICcxc3QgMm5kIDNyZCBiYXNpYycsCiAgICAgICdvbmUgdHdvIHRocmVlIHZlcnkgYmFzaWMnLCAnMSAyIDMgdmVyeSBiYXNpYycsICcxc3QgMm5kIDNyZCB2ZXJ5IGJhc2ljJ10KbnVtX2xpc3Q9WydvbmUnLCd0d28nLCd0aHJlZSddCmtleXdvcmRzID0gWydiYXNpYycsJ21haW4nLCdmb3VuZGF0aW9ucyddCmRndF9wYXJ0ID0gcidcZCsoPzpzdHxbcm5dZHx0aCk/JwpudW1fd3JkX3BhcnQgPSAnKD86e30pJy5mb3JtYXQoICd8Jy5qb2luKG51bV9saXN0KSApCmt3ZF9wYXJ0ID0gJ3wnLmpvaW4oa2V5d29yZHMpCnJ4ID0gcmUuY29tcGlsZShyJ1xiKD89KHswfSg/OlxzK3swfSkqfHsxfSg/OlxzK3sxfSkqKSlcMSg/IVxzKyg/OnsyfSlcYilccyonLmZvcm1hdChkZ3RfcGFydCwgbnVtX3dyZF9wYXJ0LCBrd2RfcGFydCksIHJlLkkpCnByaW50KHJ4LnBhdHRlcm4pCmZvciBlbGVtZW50IGluIHRleHQ6CiAgICBwcmludCggcnguc3ViKCcnLCAgZWxlbWVudCkgKQogICAg