Search code examples
pythonnlpnltkordinals

Ordinal numbers replacement


I am currently looking for the way to replace words like first, second, third,...with appropriate ordinal number representation (1st, 2nd, 3rd). I have been googling for the last week and I didn't find any useful standard tool or any function from NLTK.

So is there any or should I write some regular expressions manually?

Thanks for any advice


Solution

  • The package number-parser can parse ordinal words ("first", "second", etc) to integers.

    from number_parser import parse_ordinal
    n = parse_ordinal("first")
    

    To convert an integer to "1st", "2nd", etc, you can use the following:

    def ordinal(n: int):
        if 11 <= (n % 100) <= 13:
            suffix = 'th'
        else:
            suffix = ['th', 'st', 'nd', 'rd', 'th'][min(n % 10, 4)]
        return str(n) + suffix
    

    Here is a more terse but less readable version (taken from Gareth on codegolf):

    ordinal = lambda n: "%d%s" % (n,"tsnrhtdd"[(n//10%10!=1)*(n%10<4)*n%10::4])
    

    This works on any number:

    print([ordinal(n) for n in range(1,32)])
    
    ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th',
     '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th',
     '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th',
     '29th', '30th', '31st']