Это не совсем простой вопрос и регулярками не делается. Я делал как-то что-то близкое. Алгоритм посоветую такой:
1. Подключить поисковую систему к словарю из сорока ваших чисел. (я пользовался yandex.server - уже не выпускается, но это для примера, может быть сфинкс подойдёт, или поищите что-то ещё).
2. Брать по очереди и по одному слова из текста.
3. Проверять их нахождение в словаре в поисковой системе. (Вот тут и происходит магия, т.к. поисковая система умеет искать с учётом морфологии). Соответственно надо уметь отличать одно число из одного слова от двойного числа из двух слов (хотя можно разбить поиск на два этапа - сначала находим тексты из двух числовых слов и заменяем, потом из одного слова, но всегда есть тонкости, например, отличить от числа из трёх слов, когда будут сотни). Немного поколдуйте над числами, которые имеют двойное наименование, например, "один"-"первый"-"раз", "два"-"второй".
4. Заменять эти слова на числа, т.к. соответствие слов в словаре числам вы уже знаете.
5. Профит.
Например, ваш словарь:
один (1 в уме или в коде программы)
первый (1 в уме или в коде программы)
раз (1 в уме или в коде программы)
два (2 в уме)
три (3 в уме)
Текст:
"Квитанцию оплатить первого числа"
Квитанцию - пропустить, т.к. поисковик не найдёт в словаре
оплатить - пропустить, т.к. поисковик не найдёт в словаре
первого - поисковик найдёт "первый", меняете на "1"
числа - пропустить, т.к. поисковик не найдёт в словаре
После замены получите:
"Квитанцию оплатить 1 числа"
Но тут тоже надо быть внимательным, а то получите такой "перевод":
"Раз пошёл я на охоту..."
"1 пошёл я на охоту"
Ну, может "раз" переводить и не нужно.