推荐学习书目
› 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
chizuo
V2EX  ›  Python

Python re 正则表达式的问题,匹配薪水 low 和 high

  •  
  •   chizuo · Mar 16, 2021 · 3347 views
    This topic created in 2062 days ago, the information mentioned may be changed or developed.

    需求:一次匹配,匹配薪水 low 和 high

    字段例子:

    1. 0.7-1 万 /元;我想要得到[0.7, 1]
    2. 7 万元;我想要得到[7]
    3. 0.7 万元;我想要得到[0.7]
    4. 13.88-20.5 万 /元;我想要得到[13.88, 20.5]
    5. 2-20.5 万 /元;我想要得到[2, 20.5]
    6. 1-20 万 /元;我想要得到[1, 20]

    在正则表达式在线上( https://c.runoob.com/front-end/854 ) 用这个\d+(\.\d+)?能测试通过

    但是使用python re.findall(pattern, str)得到结果却不尽如人意

    例如:0.7-1 万 /元;我想要得到[0.7, 1]

    s = "0.7-1 万 /元"
    p = "\d+(\.\d+)?"
    print(re.findall(p, s))
    # 得到[0, 7, 1]
    

    求助各位大伙,有无 python 一次匹配可以得到的方法,谢谢啦

    9 replies  •  2021-03-17 21:19:35 +08:00
    Mitt
    Mitt
    Mar 16, 2021❤️1
    1
    ([0-9\.]+)(?:-([0-9\.]+))?
    pakro888
    pakro888
    Mar 16, 2021❤️1
    2
    @Mitt #1 楼主似乎不需要匹配“-”

    删掉应该就匹配楼主的要求了:

    ([0-9\.]+)(?:([0-9\.]+))?
    chizuo
    chizuo
    OP
    Mar 16, 2021
    3
    @Mitt @pakro888

    谢谢谢谢!我发现我好像理解错()圆括号的用途了,我以为的是将圆括号里的内容打包,比如(abc)?代表 abc 出现 0 次或 1 次,但我又查了下,这个群组大概是多种匹配的意思。

    使用(?:abc)?即圆括号里开头加上?:才是我想要的“打包”的意思,我这样理解对吗?所以表达式可以\d+(?:\.\d+)?

    非常感谢!
    zyb201314
    zyb201314
    Mar 16, 2021 via Android❤️2
    4
    这里(?:exp)没有必要吧?
    还有例子字符串中除了 float 中有'点', 没有其它单独的'点'.那么直接获取数字和点就 ok 了.如:
    s="0.7-1 万 /元;"
    print(re.findall("[\d\.]+" , s))
    chizuo
    chizuo
    OP
    Mar 16, 2021
    5
    @zyb201314 优秀,你这个是最简洁的,但是我还是用我那个,更严格一些,你懂得,你永远也不知道未知的数据长啥样 hhh
    HelloViper
    HelloViper
    Mar 17, 2021
    6
    贪婪匹配啊,"[0-9.]{1,}"
    secsilm
    secsilm
    Mar 17, 2021❤️1
    7
    @chizuo 没错,括号的作用有两种:分组和改变运算符优先级顺序。默认情况下是后者,但如果只想分组,那么就得加上 `?:`。
    secsilm
    secsilm
    Mar 17, 2021
    8
    @secsilm 加上 `?:` 后,更准确地说,就变成了 non-capturing group 。
    chizuo
    chizuo
    OP
    Mar 17, 2021
    9
    @secsilm 学到了,非常感谢!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   690 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 20:41 · PVG 04:41 · LAX 12:41 · JFK 15:41
    ♥ Do have faith in what you're doing.