匹配正则表达式的数字序列[重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

我试图实现一个将数字从西方数字转换为普通话的功能,我遇到了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的每个用例都不匹配数字11到19模式并且进入预期的分支并且从90开始匹配该模式?

提前致谢!

python regex python-3.x
1个回答
1
投票

最小的修复方法是将此正则表达式用于11-19:

numbers11to19 = re.compile('1[1-9]')

正则表达式不够复杂,无法识别数字 - 它们仅在数字上运行,因此它们无法使用多位数字。但是,这种情况恰好允许单独查看数字:如果第一个数字是1而第二个数字在1到9之间,则输入字符串匹配。

© www.soinside.com 2019 - 2024. All rights reserved.