初学正则的两个小问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ivanlw
V2EX    正则表达式

初学正则的两个小问题

  •  
  •   ivanlw 2013-04-02 08:41:44 +08:00 2469 次点击
    这是一个创建于 4575 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1.正文
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <div>test</div>
    <h3>hh33</h3>
    <p>asdf</p>
    </body>
    </html>
    想取出<div></div>之间和<p></p>之间的东西,用:
    <div>(.*)</div>[^.]*<p>(.*)</p>
    就能找出来,但是换了:
    </div>(.*)</div>[.\n\s\r]*<p>(.*)</p>
    就匹配出不来了?
    感觉两对角标之间的那些东西,就是换行符、空白符、再加上.,应该就能全部找到了吧?但是实际不行?

    2.尝试着用python来进行正则匹配
    import re
    p = re.compile('xml') #define re:p
    m = p.match('xml') #这样子m就有内容<_sre.SRE_Match object at 0x101a82100>
    但是换成:
    m = p.match('<xml') #这样子m就是None
    #
    想了下,<好像不用需要转义字符吧?
    17 条回复    1970-01-01 08:00:00 +08:00
    keakon
        1
    keakon  
       2013-04-02 10:03:05 +08:00 via iPhone
    你想丢弃 h3 的话,直接 .*? 就行了。

    或者保险点,[^<]*。
    gastlygem
        2
    gastlygem  
       2013-04-02 11:04:14 +08:00
    关于问题2,match是全字符串匹配,如果你想要匹配部分字符串,你需要用 m = p.search('<xml')
    young
        3
    young  
       2013-04-02 11:09:45 +08:00
    1楼正解 关键在于那个?号 呵呵
    doskoi
        4
    doskoi  
       2013-04-02 11:16:35 +08:00
    我记得看过一篇不要用正则去解析html, 所以用XPath把
    ivanlw
        5
    ivanlw  
    OP
       2013-04-02 12:17:39 +08:00
    @doskoi 能麻烦发一下那篇文章吗……我看到的都是说用库比较慢,用正则比较快的……
    yangg
        6
    yangg  
       2013-04-02 12:20:51 +08:00
    1. </div>(.*)</div>[\s\S]*?<p>(.*)</p>

    2. 第二个换search方法就行了,match是从开始匹配, re.match(pattern, string, flags=0)
    If zero or more characters at the beginning of string match the regular expression pattern, return a corresponding MatchObject instance.
    http://docs.python.org/release/2.7.3/library/re.html?highlight=re.match#re.match

    ps:解析html可以用BeautifulSoup
    ivanlw
        7
    ivanlw  
    OP
       2013-04-02 12:52:09 +08:00 via iPhone
    @young 问号不是0次或者一次的意思么,那.*?应该怎么理解?
    hidden
        8
    hidden  
       2013-04-02 14:18:28 +08:00
    @ivanlw <p>.*?</p> 后面那个问号表示非贪婪模式,遇到第一个</p>就停,不然会继续找后面的</p>

    http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
    halfelf
        9
    halfelf  
       2013-04-02 14:48:42 +08:00
    不要用正则解析html/xml等,正则无法完整无误的解析,况且有各种各样的xpath轮子,还用自己写
    http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not
    young
        10
    young  
       2013-04-02 21:19:51 +08:00
    @ivanlw @hidden 正解
    ivanlw
        11
    ivanlw  
    OP
       2013-04-02 23:10:15 +08:00
    @keakon 你指的是:
    <div>(.*)</div>.*?<p>(.*)</p>
    吗,这样子匹配不出来……
    ivanlw
        12
    ivanlw  
    OP
       2013-04-02 23:11:15 +08:00
    @yangg 你的这个正则匹配不出来
    ivanlw
        13
    ivanlw  
    OP
       2013-04-03 03:43:31 +08:00
    @keakon
    用的是开源中国的在线正则测试,不知道这个工具会不会有什么问题……google搜出来的
    http://imgur.com/FseGnWR
    ivanlw
        14
    ivanlw  
    OP
       2013-04-03 03:47:46 +08:00
    @yangg 哦,sorry,测试出来了……这个可以的……

    想知道下中间部分如果用[.\n]*?为什么不可以……
    我看的教程是.表示除了\n以外的所有字符,然后[]表示的是中间出现的情况都可以,所以觉得[.\n]应该是包含所有的情况了……
    keakon
        15
    keakon  
       2013-04-03 10:44:20 +08:00
    @ivanlw 有个东西叫 re.DOTALL
    yangg
        16
    yangg  
       2013-04-03 11:11:51 +08:00
    @ivanlw [.\n]不行,是因为.在[]里不转义就表示 字符".",而不是any character except newline,
    所以[.\n]只是两个字符
    http://rubular.com/r/BT2pdwyprG

    python里可以开启DOTALL模式 (?s)<div>(.*?)</div>.*?<p>(.*?)</p>
    ivanlw
        17
    ivanlw  
    OP
       2013-04-03 13:03:37 +08:00
    @yangg 多谢!如果不用python的话,正常应该怎么转义呢?这个好像不是简单的\.吧?(因为我试了\.不行)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2243 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 16:06 PVG 00:06 LAX 09:06 JFK 12:06
    Do have faith in what you're doing.
    ubao 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