正则表达式匹配数值类型字符串 - V2EX
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jarry118

正则表达式匹配数值类型字符串

  •  
  •   jarry118 Dec 29, 2018 3559 views
    This topic created in 2692 days ago, the information mentioned may be changed or developed.

    求表达式匹配 int 类型、float 类型,比如匹配 0、1.0、2,0.0000、123.345, 不匹配时间格式 2018-12-29、版本号 2.3.4。

    32 replies    2018-12-29 17:28:10 +08:00
    jarry118
        1
    jarry118  
    OP
       Dec 29, 2018
    目前用的“[0-9]+\.?[0-9]+?$” ,不能匹配 0、1、2 等个位数的 int 类型。
    wersonliu9527
        2
    wersonliu9527  
       Dec 29, 2018   1
    加个 | 匹配个位数规则?
    jinhan13789991
        3
    jinhan13789991  
       Dec 29, 2018
    我就问下,版本号 2.3 你怎么和 float 2.3 区分 /dog
    bumz
        4
    bumz  
       Dec 29, 2018
    /^([0-9]*\.)?[0-9]+$/

    把 [0-9]* 换成 [0-9]+ 可以不匹配 .1, .25 这样的浮点数
    yeyu1989
        5
    yeyu1989  
       Dec 29, 2018
    \d+\.{0,1}\d*
    geelaw
        6
    geelaw  
       Dec 29, 2018
    如果你不考虑范围、只考虑 C99 的字面量、不考虑类型后缀的话:

    整数是
    (1-9)(0-9)*|0[xX][0-9A-Fa-f]+|0(0-7)*

    第一种是十进制,第二种是十六进制,第三种是八进制。

    浮点数是

    0[xX]([0-9A-Fa-f]+(\.[0-9a-fA-F]*)?|\.[0-9a-fA-F]+)[pP][+-]?[0-9]+|[0-9]+[eE][+-]?[0-9]+|([0-9]+\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?

    第一种是十六进制,第二种是十进制没有小数点,第三种是十进制有小数点。

    提示:正负号是一元运算,而不是字面量的一部分。
    jarry118
        7
    jarry118  
    OP
       Dec 29, 2018
    @jinhan13789991 你这么一说,我竟无言以对,幸好我只是做 mysql 监控指标采集,mysql 的版本号不会为 2.3 这种的。
    goreliu
        8
    goreliu  
       Dec 29, 2018
    这个不需要用正则表达式,float("xxx") 没异常就匹配了。
    jarry118
        9
    jarry118  
    OP
       Dec 29, 2018
    @wersonliu9527 是个好方法,已经测试可以,但是我想更简单点。
    szq8014
        10
    szq8014  
       Dec 29, 2018
    \d+(\.\d+)?

    正经脸,是不是也太简单了……你是不是连去网上搜一下正则的教程的时间也没有……
    geelaw
        11
    geelaw  
       Dec 29, 2018
    @geelaw #6 Oops 整数应该是

    [1-9][0-9]*|0[xX][0-9A-Fa-f]+|0[0-7]*
    jarry118
        12
    jarry118  
    OP
       Dec 29, 2018
    @bumz 感谢,这个答案试过了,可以。
    jarry118
        13
    jarry118  
    OP
       Dec 29, 2018
    @geelaw 考虑的很周到,但是您的表达式不能过滤版本号,我这边采集的数据都是十进制的。
    Leigg
        14
    Leigg  
       Dec 29, 2018 via iPhone
    [^-](\d+([\.\d]\d+)[^-]
    jarry118
        15
    jarry118  
    OP
       Dec 29, 2018
    @szq8014 是实话,我 google 了好多呢,您的表达式不能过滤时间格式,我之前也试过。
    jarry118
        16
    jarry118  
    OP
       Dec 29, 2018
    @yeyu1989 您的也是不能过滤时间格式。
    jinhan13789991
        17
    jinhan13789991  
       Dec 29, 2018
    (?<![\d\.-])(\d+\.?\d*)(?![\d\.-])
    刚刚写的 自测通过~
    yeyu1989
        18
    yeyu1989  
       Dec 29, 2018
    @jarry118 时间格式里有三个数字,简单匹配当然能匹配上。这得看你其他限制啊,比如是空格中间的一段值吗还是什么?
    jarry118
        19
    jarry118  
    OP
       Dec 29, 2018
    @goreliu 这确实是个好方式,但是有的值是空字符串,如果强行用 float 的话,值就会变成 0.0,但是值对应的指标类型不为数值类型,所以也不能强制转换,除非再加一层类型判断,这样的话,感觉还是正则方便。
    szq8014
        20
    szq8014  
       Dec 29, 2018
    @jarry118 嗯,是的,不好意思。那你知道为什么我的答案能匹配日期吗?~ 2333
    goreliu
        21
    goreliu  
       Dec 29, 2018
    @jarry118

    >>> float("")
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ValueError: could not convert string to float:
    jinhan13789991
        22
    jinhan13789991  
       Dec 29, 2018
    @jarry118 #12 这个答案是必须数字开头结尾的啊~
    bzw875
        23
    bzw875  
       Dec 29, 2018   1
    jarry118
        24
    jarry118  
    OP
       Dec 29, 2018
    @yeyu1989 时间格式我没描述清楚,应该是 2018-12-28 15:58:48 这种。
    jarry118
        25
    jarry118  
    OP
       Dec 29, 2018
    @szq8014 刚回复被限制,当然知道原因啊
    jarry118
        26
    jarry118  
    OP
       Dec 29, 2018
    @goreliu 那您这个方案是行的通的,我大意了。
    jarry118
        27
    jarry118  
    OP
       Dec 29, 2018
    @bzw875 感谢!
    jarry118
        28
    jarry118  
    OP
       Dec 29, 2018
    @jinhan13789991 是的呢
    geelaw
        29
    geelaw  
       Dec 29, 2018
    @jarry118 #13 你可以用断言排除所有的日期的情况,或者你可以先删除所有的日期、版本号。

    你的提问非常模糊,因此大家只能靠 psychic helping.
    xpresslink
        30
    xpresslink  
       Dec 29, 2018
    不知道楼主是想要学习正则表达式呢,还是要满足需求?
    实际上根本用不着正则。

    >>> text = "比如匹配 0、1.0、2,0.0000、123.345, 不匹配时间格式 2018-12-29、版本号 2.3.4。"
    >>> [ ''.join(g) for k,g in itertools.groupby(text, lambda x: x in '0123456789.-:') if k]
    ['0', '1.0', '2', '0.0000', '123.345', '2018-12-29', '2.3.4']
    >>> list(filter(lambda y: ('-' not in y) and (y.count('.') < 2), ['0', '1.0', '2', '0.0000', '123.345', '2018-12-29', '2.3.4']))
    ['0', '1.0', '2', '0.0000', '123.345']
    >>>
    jinhan13789991
        31
    jinhan13789991  
       Dec 29, 2018
    ![cmd-markdown-logo]( http://35.220.239.255:8080/uploads/big/47fa4fd2e562a111acd32f512487e3e4.png)

    测试下图床,今天很想贴图片,但是没有图床,自己搭建了一个~
    Vegetable
        32
    Vegetable  
       Dec 29, 2018
    \d+(?:\.\d+)*
    About     Help     Advertise     Blog     API     FAQ     Solana     5812 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 86ms UTC 02:47 PVG 10:47 LAX 19:47 JFK 22:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86