Skip to main content
 首页 » 编程设计

python之用正则表达式匹配数字序列

2025年01月19日39飞鱼

<分区>

我正在尝试实现将数字从西方数字转换为普通话的功能,但我遇到了 REGEX 问题。

逻辑是这样的: 普通话中的数字遵循 3 个简单的规则。

从 0 到 10 的每个数字都有单词。

对于数字 11-19,该数字发音为“十位数”,因此例如,16 将发音(使用普通话)为“十六”。

对于 20 到 99 之间的数字,该数字发音为“十位数字”,因此例如,37 将发音(使用普通话)为“三十七”。如果数字为零,则不包括在内。

从 20 到 89 一切正常,均值不匹配模式 [11-19] 但由于某种原因从 90 开始它匹配模式 [11-90]

这是代码,所以你可以理解我在说什么。

import re 
def convert_to_mandarin(us_num): 
    ''' 
    us_num, a string representing a US number 0 to 99 
    returns the string mandarin representation of us_num 
    ''' 
    ans = None 
    numbers0to9 = re.compile('\d') 
    numbers11to19 = re.compile('[11-19]') 
 
    trans = {'0':'ling', '1':'yi', '2':'er', '3':'san', '4': 'si', 
          '5':'wu', '6':'liu', '7':'qi', '8':'ba', '9':'jiu', '10': 'shi'} 
    if len(us_num) == 1: 
        if numbers0to9.match(us_num): 
            ans = trans[us_num] 
            print(us_num) 
    else: 
        if numbers11to19.match(us_num) and len(us_num) == 2: 
            ans = trans['10'] +' ' + trans[us_num[1]]     
            print(us_num) 
        elif us_num[1] == '0' and len(us_num) == 2: 
            ans = trans[us_num[0]] + ' ' + trans['10'] 
            print(us_num) 
        else: 
            ans = trans[us_num[0]] + ' ' + trans['10'] +' ' + trans[us_num[1]]     
            print(us_num) 
    return ans 
print(convert_to_mandarin(str('3'))) 
print(convert_to_mandarin(str('15'))) 
print(convert_to_mandarin(str('71'))) 
print(convert_to_mandarin(str('81'))) 
print(convert_to_mandarin(str('91'))) 

那么,为什么 20-99 的每个用例都不匹配 numbers11to19 模式并进入预期的分支,而从 90 开始匹配该模式?

提前致谢!