2014-09-01 87 views
0

我需要編寫一個Python PROGRAMM在字符串文本西班牙語數字轉換成位數:解析字符串文本NUM西班牙語語法

輸入:

'Ciento Veinticuatro Mil Ochocientos Treinta y Cinco' 

輸出所需:

124835 

我寫了一些代碼,但我意識到我正在重新發明輪子,只是一個解析器。所以,我需要使用lexic/grammar解析器模塊。但我以前從來沒有用lexic/grammar解析器處理過,首先需要編寫BNF或PEG符號(我還沒決定使用哪個解析器模塊,我可以找到最簡單的模塊)。

這對我來說很難,數字的西班牙語語法與英語非常不同。

我的方法:

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

我擔心,它是講西班牙語的問題。

+0

我不知道爲什麼你認爲西班牙的數字是從英語如此不同,它基本上是相同的結構。當然,還有融合的數百(與性別:quinientas),但這是一個小細節,你的示例代碼似乎是在正確的軌道上。嘗試愛爾蘭語,如果你想要一些複雜的東西:) – rici 2014-09-02 03:42:38

+0

@rici不僅融合的數百有性別。 >「靜脈」,「靜脈」。一些數字有三種形式(更多帶有重音字符):21 - >「靜脈」,「靜脈」,「靜脈」,「靜脈」。在數十和單位之間連接「y」:35->「treinta」「y」「cinco」。儘管如此,西班牙語並不是我國(西班牙)最糾結的語言,在北方講巴斯克語(也稱爲「Euskera」),其數字系統是一個瘋狂的問題:http://www.santurtzieus.com/ gelairekia/laguntza/funtzioak/los_numeros.htm – Trimax 2014-09-02 06:54:27

+0

Si pues pero no hay problema en reconocer las variantes; solo tienes que poner todas en tuléxico。 Y ignorar la'y'。 Yo que tuignoraríalos acentostambién; mucha gente no les teclean,especialmente si no tienen un teclado adecuado。 Y insisto queirlandéses aun peor que vasco。體育quince es「acúigdéag」(acuíg= 5; deich = 10)y 17 es「a seachtdéag」。佩羅。 15 libras:「cuígphuntdéag」。 17 libras:「seunt bpuntdéag」。 Libra es「punt」,pero losnúmeroscambian la palabra siguiente:cinco phunt(funt),siete bpunt(bunt,la p es mudaacá)。 Y se entremezclan:siete bunt diez。 – rici 2014-09-02 08:12:39

回答

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') 
+0

在西班牙語語法中糾纏不清。你可以在https://gist.github.com/SalvaJ/3bd467a23cc4d162ee6f – Trimax 2014-09-01 11:51:48

+0

看到我的方法是的,這只是一個例子,指出你可能的途徑來解決問題 – klashxx 2014-09-01 12:15:37

相關問題