将字符串文本解析为西班牙语语法中的数字

时间:2014-09-01 10:43:29

标签: python parsing bnf peg

我需要编写一个Python程序,将字符串文本中的西班牙语数字转换为数字数字:

输入:

'Ciento Veinticuatro Mil Ochocientos Treinta y Cinco'

所需输出:

124835

我写了一些代码,但我意识到我正在重新发明轮子,只是一个解析器。所以,我需要使用lexic / grammar解析器模块。但我以前从未处理过lexic / grammar解析器,首先需要编写BNF或PEG表示法(我还没决定使用哪个解析器模块,这是我能找到的最简单的。)

这对我来说很难,西班牙语的数字语法与英语完全不同。

我的方法:

<numeral> ::= ([<centenas>][<decenas>][<unidades>])+ [<millares>]

我担心这对西班牙人来说是一个问题。

1 个答案:

答案 0 :(得分:0)

您可以通过对text2num库进行一些修改来实现此目的:https://github.com/ghewgill/text2num

import re

Small = {
    'cinco': 5,
    'veinticuatro': 24,
    'treinta': 30,
    'ciento': 100,
    'ochocientos': 800
}


Magnitude = {
    'mil':          1000
}

class NumberException(Exception):
    def __init__(self, msg):
        Exception.__init__(self, msg)

def text2num(s):
    a = re.split(r"[\s-]+", s.lower())
    n = 0
    g = 0
    for w in a:
        if w == 'y':
           continue
        x = Small.get(w, None)
        if x is not None:
            g += x
        else:
            x = Magnitude.get(w, None)
            if x is not None:
                n += g * x
                g = 0
            else:
                raise NumberException("Unknown number: "+w)
    return n + g

if __name__ == "__main__":
    assert 124835 == text2num('Ciento Veinticuatro Mil Ochocientos Treinta y Cinco')