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

初学正则的两个小问题

  •  
  •   ivanlw · 2013-04-02 08:41:44 +08:00 · 2182 次点击
    这是一个创建于 4280 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   5306 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 08:31 · PVG 16:31 · LAX 00:31 · JFK 03:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.