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) )
rx = re .compile ( r'\b ((?:{0}(?:\s +{0})*|{1}(?:\s +{1})*)\s +(?:{2})\b )|\b (?:{0}(?:\s +{0})*|{1}(?:\s +{1})*)' .format ( dgt_part, num_wrd_part, '|' .join ( keywords) ) , re .I )
print ( rx.pattern )
for element in text:
print ( rx.sub ( lambda x: x.group ( 1 ) or '' , element) .strip ( ) )
aW1wb3J0IHJlCgp0ZXh0PVsnb25lIHR3byB0aHJlZSBiYXNpYycsICcxIDIgMyBiYXNpYycsICcxc3QgMm5kIDNyZCBiYXNpYycsCiAgICAgICdvbmUgdHdvIHRocmVlIHZlcnkgYmFzaWMnLCAnMSAyIDMgdmVyeSBiYXNpYycsICcxc3QgMm5kIDNyZCB2ZXJ5IGJhc2ljJ10KbnVtX2xpc3Q9WydvbmUnLCd0d28nLCd0aHJlZSddCmtleXdvcmRzID0gWydiYXNpYycsJ21haW4nLCdmb3VuZGF0aW9ucyddCmRndF9wYXJ0ID0gcidcZCsoPzpzdHxbcm5dZHx0aCk/JwpudW1fd3JkX3BhcnQgPSAnKD86e30pJy5mb3JtYXQoICd8Jy5qb2luKG51bV9saXN0KSApCgpyeCA9IHJlLmNvbXBpbGUocidcYigoPzp7MH0oPzpccyt7MH0pKnx7MX0oPzpccyt7MX0pKilccysoPzp7Mn0pXGIpfFxiKD86ezB9KD86XHMrezB9KSp8ezF9KD86XHMrezF9KSopJy5mb3JtYXQoZGd0X3BhcnQsIG51bV93cmRfcGFydCwgJ3wnLmpvaW4oa2V5d29yZHMpKSwgcmUuSSkKcHJpbnQocngucGF0dGVybikKZm9yIGVsZW1lbnQgaW4gdGV4dDoKICAgIHByaW50KCByeC5zdWIobGFtYmRhIHg6IHguZ3JvdXAoMSkgb3IgJycsICBlbGVtZW50KS5zdHJpcCgpICkKICAgIA==