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
zitianDai
V2EX  ›  Python

关与正则表达式中的 括号,请教。

  •  
  •   zitianDai · 2019-12-21 16:20:40 +08:00 · 3605 次点击
    这是一个创建于 1580 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学 python,使用正则表达式。
    看教程说 “(z|f)ood” 匹配“zood”或“food”
    但我使用如下代码测试

    s = "zood food"
    print(re.findall("(z|f)ood", s))
    

    输出为 ['z', 'f']。 不知道哪里出了问题,请各位指点下,谢谢。

    现在有些不理解是括号出了问题,还是|出了问题。

    14 条回复    2019-12-21 21:03:34 +08:00
    wd
        1
    wd  
       2019-12-21 16:24:28 +08:00 via iPhone
    你试试看把 findall 改成 match search 什么的试试
    xfspace
        2
    xfspace  
       2019-12-21 16:25:33 +08:00 via Android
    [zf]ood
    jyyx
        3
    jyyx  
       2019-12-21 16:26:41 +08:00
    应该是把括号()改成中括号[]
    zitianDai
        4
    zitianDai  
    OP
       2019-12-21 16:29:57 +08:00
    @wd 谢谢您恢复,换成 search 后可以匹配出 zood, 那说明我使用 findall 出了问题,因为我想返回一个匹配的列表,使用 findall 是最好的,不知道为什么出了问题。
    zitianDai
        5
    zitianDai  
    OP
       2019-12-21 16:32:50 +08:00
    @xfspace 谢谢回复,这只是一个示例,可能没有写清楚,我实际要用的是 在字符串 "aa bb cc aa cc"中匹配出"aa bb cc","aa cc",我使用"aa(\s*bb\s*|\s*)cc"匹配出了问题,才来询问。
    zitianDai
        6
    zitianDai  
    OP
       2019-12-21 16:33:30 +08:00
    @jyyx 谢谢回复,详细请看#5
    jyyx
        7
    jyyx  
       2019-12-21 16:38:52 +08:00
    s = "aa bb cc aa cc"
    for i in re.finditer("aa(\s*bb\s*|\s*)cc", s):
    print(i.group())
    imn1
        8
    imn1  
       2019-12-21 16:41:35 +08:00   ❤️ 1
    既不是正则写错了,也不是 findall 出问题,而是 findall 比较特别
    它输出的是每个子匹配(一对括号)内的内容
    你试试多加几对括号,或者嵌套括号,看看结果就知道了
    zitianDai
        9
    zitianDai  
    OP
       2019-12-21 16:55:06 +08:00
    @imn1 感谢您回复,刚刚我也查到了。findall 存在优先级查询,会优先将括号内容返回,想匹配结果,需要取消权限,使用 "(?:z|f)ood" 可正确匹配出结果。
    009694
        10
    009694  
       2019-12-21 17:24:53 +08:00 via iPhone
    这个不叫优先级查询 叫非捕获组
    009694
        11
    009694  
       2019-12-21 17:26:09 +08:00 via iPhone
    实际 (?:z|f)ood 跟 [zf]ood 就是等价的
    009694
        12
    009694  
       2019-12-21 17:32:41 +08:00 via iPhone
    另外#5 的需求用 aa (?:bb |)cc
    wqzjk393
        13
    wqzjk393  
       2019-12-21 18:02:35 +08:00 via iPhone
    没记错的话小括号主要作用是限制返回的是哪一部分。
    frostming
        14
    frostming  
       2019-12-21 21:03:34 +08:00
    括号会有额外的作用,它会限制 findall 返回的内容为它分组内部的内容

    如果你想返回整个匹配,应该用非捕获组(?:) ,或者直接用[zf]替代(推荐后一种)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1178 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:11 · PVG 07:11 · LAX 16:11 · JFK 19:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.