El problema

La entrada es una oración que contiene palabras, números y números ordinales como 1st, 2nd, 60th y etc.

La salida debe contener solo palabras. Por ejemplo:

  • 1stfirst
  • 2ndsecond
  • 60thsixtieth
  • 523rdfive hundred twenty-third

Lo que he intentado

num2words convierte los números en palabras. Pero no funciona para términos ordinales como 1st, 2nd, 60th y etc.

La pregunta

¿Cómo es posible usar Python para convertir números ordinales en palabras?

3
Michael 30 oct. 2017 a las 15:21

3 respuestas

La mejor respuesta

Elimine las terminaciones ordinales de las cadenas:

import re

re.findall('\d+', stringValue)

Y luego usar

num2words(foundInteger, ordinal=True)
3
Minory 30 oct. 2017 a las 12:33

La solución completa

import re
from num2words import num2words


def replace_ordinal_numbers(text):
    re_results = re.findall('(\d+(st|nd|rd|th))', text)
    for enitre_result, suffix in re_results:
        num = int(enitre_result[:-2])
        text = text.replace(enitre_result, num2words(num, ordinal=True))
    return text


def replace_numbers(text):
    re_results = re.findall('\d+', text)
    for term in re_results:
        num = int(term)
        text = text.replace(term, num2words(num))
    return text


def convert_numbers(text):
    text = replace_ordinal_numbers(text)
    text = replace_numbers(text)

    return text


if __name__ == '__main__':
    assert convert_numbers('523rd') == 'five hundred and twenty-third'
4
Michael 31 oct. 2017 a las 09:21

Con num2words, debe usar ordinal=True para obtener el resultado que desea, como se indica en su documentación:

from num2words import num2words

print(num2words(1, ordinal=True))
print(num2words(2, ordinal=True))
print(num2words(60, ordinal=True))
print(num2words(523, ordinal=True))

Huellas:

first
second
sixtieth
five hundred and twenty-third
7
asongtoruin 30 oct. 2017 a las 12:26