V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
geekyoung
V2EX  ›  程序员

一个很简单的正则问题,没搞明白

  •  
  •   geekyoung · 2017-12-29 21:25:00 +08:00 · 3085 次点击
    这是一个创建于 2553 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #!/usr/bin/python
    import re
    line = "Cats are smarter than dogs"
    matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
    if matchObj:
        print "matchObj.group() : ", matchObj.group()
        print "matchObj.group(1) : ", matchObj.group(1)
        print "matchObj.group(2) : ", matchObj.group(2)
    else:
        print "No match!!"
    

    这来自菜鸟上的教程,自己正则上也一直类似这么写的。 但今天突然想到一个问题,刚开始使用(.*)来匹配的话,岂不是直接可以匹配到最后了, .* 代表匹配除换行符之外的所有字符, 那 are (.*?) .* 这块怎么匹配呢?实在无解。

    29 条回复    2018-01-01 10:02:07 +08:00
    geekyoung
        1
    geekyoung  
    OP
       2017-12-29 21:30:57 +08:00
    比如说刚开始 . 开始匹配 C 然后 a t s 空格 a r........直接给一口气到最后了,怎么去检测 are 这个模式呢?是不是检测到头,然后再转回头找,唉 乱了乱了
    OscarUsingChen
        2
    OscarUsingChen  
       2017-12-29 21:42:43 +08:00 via iPhone
    nazor
        3
    nazor  
       2017-12-29 21:47:45 +08:00 via iPhone
    编译原理上有讲这个,有限自动机那章。
    skydiver
        4
    skydiver  
       2017-12-29 22:16:15 +08:00 via Android
    写错了呗,没有这么写的
    boboliu
        5
    boboliu  
       2017-12-29 22:28:28 +08:00
    带?的是 lazy 模式,不带问号是 greedy。

    lazy 是能匹配多少匹配多少,greedy 是能匹配多少匹配多少,懂了么?(滑稽



    P.S. 建议看楼上发的文档
    boboliu
        6
    boboliu  
       2017-12-29 22:34:28 +08:00
    @boboliu 等等被楼上带飞了。。。这个*也是有界限的,就是到下一个关键字能够匹配为止。
    OscarUsingChen
        7
    OscarUsingChen  
       2017-12-29 22:37:47 +08:00 via iPad
    @boboliu 建议友善一点,谁都有不懂的时候
    boboliu
        8
    boboliu  
       2017-12-29 22:42:27 +08:00
    @OscarUsingChen 额。。。在下自认为。。。似乎没有不友善的地方?
    tanszhe
        9
    tanszhe  
       2017-12-29 22:43:26 +08:00
    这个就不应该用正则表达式 直接用 are 切分 去后面的那个单词 肯定比 正则表达式 高效多了
    boboliu
        10
    boboliu  
       2017-12-29 22:45:54 +08:00
    @tanszhe 直接用 are 切分之后对着后面再上一个空格切分?感觉那还不如正则优雅吧?
    cnt2ex
        11
    cnt2ex  
       2017-12-29 22:49:28 +08:00
    匹配失败了就回溯
    benyuanzhang
        12
    benyuanzhang  
       2017-12-29 23:51:52 +08:00 via Android
    @boboliu 大概说的是断句吧
    再一次感叹汉语博大精深
    ffkjjj
        13
    ffkjjj  
       2017-12-30 01:48:29 +08:00 via iPhone
    (.*?)后面有个空格。
    imn1
        14
    imn1  
       2017-12-30 01:52:21 +08:00
    第二个括号中的问号很重要,基本确定了是 are 后两个空格间的内容,其他就很容易推导了
    azh7138m
        15
    azh7138m  
       2017-12-30 15:09:50 +08:00   ❤️ 2
    http://deerchao.net/tutorials/regex/regex.htm#greedyandlazy

    最先开始的匹配拥有最高的优先权

    这个 30 分钟入门其实写的不错(
    geekyoung
        16
    geekyoung  
    OP
       2017-12-30 21:51:17 +08:00
    @OscarUsingChen 刚才看了,谢谢。但是请问,在这个问题情景下,那么第一个是贪婪匹配,那这个 are 是回溯过来找的?还是正则表达式在匹配的过程中一直在发现 are ?
    geekyoung
        17
    geekyoung  
    OP
       2017-12-30 21:51:41 +08:00
    @skydiver 不是错的,可以成功匹配
    geekyoung
        18
    geekyoung  
    OP
       2017-12-30 21:52:21 +08:00
    @boboliu 谢谢!以前喜欢一个人,现在喜欢一个人
    geekyoung
        19
    geekyoung  
    OP
       2017-12-30 21:53:57 +08:00
    @boboliu 就是到下一个关键字能够匹配为止。 那这个下一个关键字是在找的过程中一直去“发现的”,还是走到结束后再回过头来找的?既然是贪婪匹配。
    geekyoung
        20
    geekyoung  
    OP
       2017-12-30 21:55:06 +08:00
    @tanszhe 只匹配 Cats 和 smarter
    geekyoung
        21
    geekyoung  
    OP
       2017-12-30 21:55:44 +08:00
    @cnt2ex 哦哦
    geekyoung
        22
    geekyoung  
    OP
       2017-12-30 21:56:08 +08:00
    @imn1 明白 谢谢
    geekyoung
        23
    geekyoung  
    OP
       2017-12-30 21:56:23 +08:00
    @azh7138m 好文 赞
    skydiver
        24
    skydiver  
       2017-12-30 23:23:26 +08:00 via Android
    @geekyoung 好吧…眼花了没看到空格
    OscarUsingChen
        25
    OscarUsingChen  
       2017-12-30 23:43:39 +08:00 via iPad
    @geekyoung 如果第一项匹配了整个 string,那么这个 Regex 算是匹配失败,因为后面的一堆 regex 东西没法匹配到东西
    mztql
        26
    mztql  
       2017-12-31 03:01:11 +08:00 via iPhone
    @azh7138m 啊哈 当初也看了这个
    Telegram
        27
    Telegram  
       2018-01-01 08:45:04 +08:00 via iPhone
    @boboliu #5 帅哥,你 5 楼说的前半句和后半句有区别吗?
    boboliu
        28
    boboliu  
       2018-01-01 09:17:26 +08:00
    @Telegram 有区别啊,这里是因为文字丢失了来自重读的部分信息,所以你只能脑补理解
    Telegram
        29
    Telegram  
       2018-01-01 10:02:07 +08:00 via iPhone
    @boboliu #28 原来你是故意的。。。。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4522 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:05 · PVG 09:05 · LAX 17:05 · JFK 20:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.