V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
itskingname
V2EX  ›  分享创造

正则表达式 re.sub 替换不完整的问题现象及其根本原因

  •  
  •   itskingname · 2018-08-28 08:09:09 +08:00 · 2161 次点击
    这是一个创建于 2283 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是一个说隐蔽比较隐蔽,说弱智也比较弱智的坑。

    造成这个坑的原因有两点:

    • 多个默认参数不带参数名的时候,按顺序从左侧填写
    • 很多编程语言里面常量都会使用一个数字并赋值给一个大写变量来表示

    如果习惯看源代码或者官方文档,要解决这个问题不超过 2 分钟。而如果不看文档不看源代码,只知道去网上搜搜搜,那么要解决这个问题可能需要的时间会超过两小时。

    正则表达式 re.sub 替换不完整的问题现象及其根本原因

    14 条回复    2018-08-28 11:45:12 +08:00
    delectate
        1
    delectate  
       2018-08-28 08:22:19 +08:00
    >>> import re
    >>> print(int(re.S))
    16

    学习了。
    imn1
        2
    imn1  
       2018-08-28 08:32:15 +08:00   ❤️ 1
    不读文档、手册怪谁呢?
    自己跳过一个参数,这个哪个语言都不行吧?基础知识

    flags 是整数,也是看手册就知道啊,默认参数 flags=0,不就明显是整数么?
    Leigg
        3
    Leigg  
       2018-08-28 08:38:59 +08:00 via iPhone   ❤️ 1
    。。。这个纯属于使用者粗心大意,我还以为是 re 库本身有问题呢,像这种 re.S/I/M,一般都是库内部使用 int 做的枚举值,类似的还有 pymongo.ASCENDING。
    itskingname
        4
    itskingname  
    OP
       2018-08-28 09:11:16 +08:00
    @Leigg 你和
    @imn1

    你们两人为什么都只看到了表象呢。这里正则表达式只是举个例子而已。

    我想强调的点是:

    多个默认参数不带参数名的时候,按顺序从左侧填写
    很多编程语言里面常量都会使用一个数字并赋值给一个大写变量来表示
    多个默认参数值的类型一样,使用的时候又不带参数名,可能会导致文章中类似的不容易发现的 bug。
    blodside
        5
    blodside  
       2018-08-28 09:24:45 +08:00 via Android
    我一般用三个以上参数的时候都是指定参数名的
    rrfeng
        6
    rrfeng  
       2018-08-28 09:27:50 +08:00 via Android
    我只说一句,这就是 Python 蠢的地方了啊!
    luyangk
        7
    luyangk  
       2018-08-28 09:39:01 +08:00
    在使用一个函数之前第一步不就是了解它的参数是什么吗。。。为什么这个步骤会放到了 debug 的时候。。。如果在知道函数有 5 个参数的情况下,只传了 4 个还没指定参数名,怎么想都会知道有问题吧
    imn1
        8
    imn1  
       2018-08-28 09:41:16 +08:00   ❤️ 1
    @itskingname
    是你只看到我说的「表象」

    我说的就是,你所强调的各点都是基础,连我这个不是程序员的人都懂的
    尤其读手册是基础中的基础
    使用任何函数、类、API 都该搞清楚输入格式和输出格式,怎能想当然呢
    itskingname
        9
    itskingname  
    OP
       2018-08-28 09:50:11 +08:00
    @imn1 唉,我觉得肯定是我这个例子没有举好
    noqwerty
        10
    noqwerty  
       2018-08-28 09:50:48 +08:00 via Android
    感觉这个不能怪库啊……传参数也要讲基本法吧
    whileFalse
        11
    whileFalse  
       2018-08-28 10:14:54 +08:00
    要怪罪到语言 /IDE 身上吗?
    lxy42
        12
    lxy42  
       2018-08-28 11:02:26 +08:00
    @itskingname #4
    > 多个默认参数不带参数名的时候,按顺序从左侧填写

    “按顺序从左赋参”难道不是很符合直觉的做法吗?

    > 很多编程语言里面常量都会使用一个数字并赋值给一个大写变量来表示

    用整数表示常量也是很普遍的做法啊。


    你这个明显就是不熟悉函数用法导致的错误,跟库本身一点关系都没有。
    lxy42
        13
    lxy42  
       2018-08-28 11:03:00 +08:00
    @rrfeng #6 请问蠢在哪里?
    itskingname
        14
    itskingname  
    OP
       2018-08-28 11:45:12 +08:00
    @lxy42 我都说了 re.sub 只是我举得一个例子。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3418 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:43 · PVG 08:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.