一个很简单的正则问题,没搞明白 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
geekyoung
V2EX    程序员

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

  •  
  •   geekyoung 2017-12-29 21:25:00 +08:00 3512 次点击
    这是一个创建于 2932 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #!/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
    @< href="/member/cnt2ex">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     Solana     2692 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:28 PVG 20:28 LAX 04:28 JFK 07:28
    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