Продолжая обсуждение с @Paul и следуя решению от @alecxe, я предложил следующее решение, которое работает на ряде тестовых случаев, я поставил задачу немного сложнее:
Шаг 1: получить исключенные токены
import dateutil.parser as dparser
ostr = 'something sep 28 2017 something abcd'
_, excl_str = dparser.parse(ostr,fuzzy_with_tokens=True)
дает выходные данные:
excl_str: ('something ', ' ', 'something abcd')
Шаг 2: ранжировать токены по длине
excl_str = list(excl_str)
excl_str.sort(reverse=True,key = len)
дает отсортированный список токенов:
excl_str: ['something abcd', 'something ', ' ']
Шаг 3: удаление токенов и игнорирование пробела
for i in excl_str:
if i != ' ':
ostr = ostr.replace(i,'')
return ostr
дает окончательный вывод
ostr: 'sep 28 2017 '
Примечание: шаг 2 необходим, потому что это вызовет проблему, если какой-либо более короткий токен подмножество более длинных.например, в этом случае, если удаление следует порядку ('something ', ' ', 'something abcd')
, процесс замены удалит something
из something abcd
, а abcd
никогда не удалится, в результате 'sep 28 2017 abcd'