美文网首页正则表达式
如何用python写一个正则表达式,匹配每 3 位就有一个逗号的

如何用python写一个正则表达式,匹配每 3 位就有一个逗号的

作者: 小魚傳説 | 来源:发表于2019-11-07 22:13 被阅读0次

    如何用python写一个正则表达式,匹配每 3 位就有一个逗号的数字(千分号)?

    这个是《Python编程快速上手 让繁琐工作自动化》正则表达式这一章的习题
    下午摸索了半天,本身对正则不是特别了解,之前接触过一些,近几天学习python,又开始倒腾了
    下面是我自己下午写的,请大家指导下

    import re
    threeNumRegex = re.compile(r'''
        (?:(?<![\d|\,])\d{1,3}(?=\s)) #匹配只有1-3位数,左边
        |
        (?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s) #匹配带有","的情况
    ''', re.VERBOSE)
    text = '''
        12
        12,333
        12,12
        4444
        234,45,234
        873,238,23,222
        837,228,112
        2211,341,394,222
    '''
    result = threeNumRegex.findall(text)
    print(result)
    

    为什么是

    (?:(?<![\d|\,])\d{1,3}(?=\s))|(?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s)
    

    其中

    (?<![\d|\,])\d{1,3}(?=\s)) 
    

    是用来匹配只有1-3位数的情况,前面不能是数字或者",",如果没有前面的否定负向零宽断言

    (?<![\d|\,])
    

    就会出现下面这样的匹配情况

    ['12', '333', '12', '444', '234', '222', '112', '222']
    

    得不到正确的结果
    另外,还需要加一个肯定正向零宽断言

    (?=\s)
    

    如果不加,结果会是这样

    ['12', '12', '12', '444', '234', '873', '837', '221']
    

    也不正确

    (?<![\d|\,])(?:\d{1,3})(?:\,\d{3})+(?=\s)
    

    这一部分是匹配带有“,”的情况,就不详细说了

    就是不知道还有没有其他更简便的方式?
    有的话,帮忙留言给我,请大家多多赐教

    相关文章

      网友评论

        本文标题:如何用python写一个正则表达式,匹配每 3 位就有一个逗号的

        本文链接:https://www.haomeiwen.com/subject/qzsbbctx.html