有没有办法把数字单词转换成整数?

有没有办法把数字单词转换成整数?

我需要皈依one1two2诸若此类。

有什么方法可以用库或类什么的吗?


慕斯709654
浏览 443回答 3
3回答

HUX布斯

该代码的大部分内容是设置numword dict,这只在第一次调用时完成。def text2int(textnum, numwords={}):     if not numwords:       units = [         "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",         "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",         "sixteen", "seventeen", "eighteen", "nineteen",       ]       tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]       scales = ["hundred", "thousand", "million", "billion", "trillion"]       numwords["and"] = (1, 0)       for idx, word in enumerate(units):    numwords[word] = (1, idx)       for idx, word in enumerate(tens):     numwords[word] = (1, idx * 10)       for idx, word in enumerate(scales):   numwords[word] = (10 ** (idx * 3 or 2), 0)     current = result = 0     for word in textnum.split():         if word not in numwords:           raise Exception("Illegal word: " + word)         scale, increment = numwords[word]         current = current * scale + increment        if scale > 100:             result += current             current = 0     return result + currentprint text2int("seven billion one hundred million thirty one thousand three hundred thirty seven")#7100031337

慕码人8056858

如果有人感兴趣的话,我会黑出一个版本来维护剩下的字符串(尽管它可能有错误,但是没有对它进行太多的测试)。def text2int (textnum, numwords={}):     if not numwords:         units = [         "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",         "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",         "sixteen", "seventeen", "eighteen", "nineteen",         ]         tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]         scales = ["hundred", "thousand", "million", "billion", "trillion"]         numwords["and"] = (1, 0)         for idx, word in enumerate(units):  numwords[word] = (1, idx)         for idx, word in enumerate(tens):       numwords[word] = (1, idx * 10)         for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)     ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}     ordinal_endings = [('ieth', 'y'), ('th', '')]     textnum = textnum.replace('-', ' ')     current = result = 0     curstring = ""     onnumber = False     for word in textnum.split():         if word in ordinal_words:             scale, increment = (1, ordinal_words[word])             current = current * scale + increment            if scale > 100:                 result += current                 current = 0             onnumber = True         else:             for ending, replacement in ordinal_endings:                 if word.endswith(ending):                     word = "%s%s" % (word[:-len(ending)], replacement)             if word not in numwords:                 if onnumber:                     curstring += repr(result + current) + " "                 curstring += word + " "                 result = current = 0                 onnumber = False             else:                 scale, increment = numwords[word]                 current = current * scale + increment                if scale > 100:                     result += current                     current = 0                 onnumber = True     if onnumber:         curstring += repr(result + current)     return curstring例子: >>> text2int("I want fifty five hot dogs for two hundred dollars.")  I want 55 hot dogs for 200 dollars.如果你有“200美元”的话,可能会有问题。但是这真的很难。

MMMHUHU

我需要处理几个额外的解析案例,比如序数词(“第一”、“第二”)、连字符词(“100”)和连字符顺序词(“57”),所以我增加了几行:def text2int(textnum, numwords={}):     if not numwords:         units = [         "zero", "one", "two", "three", "four", "five", "six", "seven", "eight",         "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",         "sixteen", "seventeen", "eighteen", "nineteen",         ]         tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]         scales = ["hundred", "thousand", "million", "billion", "trillion"]         numwords["and"] = (1, 0)         for idx, word in enumerate(units):  numwords[word] = (1, idx)         for idx, word in enumerate(tens):       numwords[word] = (1, idx * 10)         for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)     ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5, 'eighth':8, 'ninth':9, 'twelfth':12}     ordinal_endings = [('ieth', 'y'), ('th', '')]     textnum = textnum.replace('-', ' ')     current = result = 0     for word in textnum.split():         if word in ordinal_words:             scale, increment = (1, ordinal_words[word])         else:             for ending, replacement in ordinal_endings:                 if word.endswith(ending):                     word = "%s%s" % (word[:-len(ending)], replacement)             if word not in numwords:                 raise Exception("Illegal word: " + word)             scale, increment = numwords[word]          current = current * scale + increment         if scale > 100:             result += current             current = 0     return result + current`
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python