V2EX = way to explore
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
chizuo
V2EX  ›  Python

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

  •  
  •   chizuo · 2021-03-16 19:28:27 +08:00 · 1949 次点击
    这是一个创建于 1352 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:一次匹配,匹配薪水 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 条回复    2021-03-17 21:19:35 +08:00
    Mitt
        1
    Mitt  
       2021-03-16 19:33:04 +08:00   ❤️ 1
    ([0-9\.]+)(?:-([0-9\.]+))?
    pakro888
        2
    pakro888  
       2021-03-16 19:39:54 +08:00   ❤️ 1
    @Mitt #1 楼主似乎不需要匹配“-”

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

    ([0-9\.]+)(?:([0-9\.]+))?
    chizuo
        3
    chizuo  
    OP
       2021-03-16 20:01:02 +08:00
    @Mitt @pakro888

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

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

    非常感谢!
    zyb201314
        4
    zyb201314  
       2021-03-16 21:24:30 +08:00 via Android   ❤️ 2
    这里(?:exp)没有必要吧?
    还有例子字符串中除了 float 中有'点', 没有其它单独的'点'.那么直接获取数字和点就 ok 了.如:
    s="0.7-1 万 /元;"
    print(re.findall("[\d\.]+" , s))
    chizuo
        5
    chizuo  
    OP
       2021-03-16 22:51:05 +08:00
    @zyb201314 优秀,你这个是最简洁的,但是我还是用我那个,更严格一些,你懂得,你永远也不知道未知的数据长啥样 hhh
    HelloViper
        6
    HelloViper  
       2021-03-17 10:26:21 +08:00
    贪婪匹配啊,"[0-9.]{1,}"
    secsilm
        7
    secsilm  
       2021-03-17 16:14:05 +08:00   ❤️ 1
    @chizuo 没错,括号的作用有两种:分组和改变运算符优先级顺序。默认情况下是后者,但如果只想分组,那么就得加上 `?:`。
    secsilm
        8
    secsilm  
       2021-03-17 16:15:46 +08:00
    @secsilm 加上 `?:` 后,更准确地说,就变成了 non-capturing group 。
    chizuo
        9
    chizuo  
    OP
       2021-03-17 21:19:35 +08:00
    @secsilm 学到了,非常感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:38 · PVG 14:38 · LAX 22:38 · JFK 01:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.