开发者社区> shy丶gril> 正文

使用Python正则表达式RE从CSDN博客源代码中匹配出博客信息

简介:
+关注继续查看

前面我们说到了如何在Python正则表达式z中匹配中文,说到了另一种方法,这就是如何巧妙的使用Python正则表达式匹配模式的问题了

Python匹配模式

re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。
可选值有:

主要非英文语系字符范围

模式 名称 说明
re.I re.IGNORECASE 忽略大小写(括号内是完整写法,下同)
re.M MULTILINE 多行模式,改变'^'和'$'的行为
re.S DOTALL 点任意匹配模式,改变'.'的行为, 使".“可以匹配任意字符
re.L LOCALE 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
re.U UNICODE 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
re.X VERBOSE 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。以下两个正则表达式是等价的:

 

具体参见如下代码

 

  1. #!coding:utf-8  
  2.   
  3. import re  
  4. import sys  
  5. import urllib2  
  6.   
  7.   
  8. # 测试匹配中文信息  
  9. def TestReChinese( ):  
  10.     reload(sys)  
  11.     sys.setdefaultencoding( "utf-8" )  
  12.   
  13.     # 这段HTML代码是从博客列表页面中摘取出来的单个博客的信息, 我们要从中摘取出  
  14.     page  =   r"""<div class="list_item article_item"> 
  15.              
  16.     <div class="article_title">    
  17.         <span class="ico ico_type_Original"> 
  18.         </span> 
  19.                  
  20.         <h1> 
  21.             <span class="link_title"> 
  22.                 <a href="/gatieme/article/details/43235791"> 
  23.                 Python正则表达式匹配中文 
  24.                 </a> 
  25.             </span> 
  26.         </h1> 
  27.     </div> 
  28.  
  29.     <div class="article_description"> 
  30.     在使用Python的过程中,由于需求原因,我们经常需要在文本或者网页元素中用Python正则表达式匹配中文,但是我们经常所熟知的正则表达式却只能匹配英文,而对于中文编码却望尘莫及,于是我大量Google,几经Baidu,花了两个多个小时测试,终于发现解决的办法。特记录如下    字符串的角度来说,中文不如英文整齐、规范,这是不可避免的现实。本文结合网上资料以及个人经验,以 python 语言为例,...         
  31.     </div> 
  32.          
  33.     <div class="article_manage"> 
  34.              
  35.         <span class="link_postdate">2015-01-28 19:34 
  36.         </span> 
  37.              
  38.         <span class="link_view" title="阅读次数"> 
  39.             <a href="/gatieme/article/details/43235791" title="阅读次数">阅读</a>(64) 
  40.         </span> 
  41.              
  42.         <span class="link_comments" title="评论次数"> 
  43.             <a href="/gatieme/article/details/43235791#comments" title="评论次数" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0) 
  44.         </span> 
  45.      
  46.         <span class="link_edit"><a href="http://write.blog.csdn.net/postedit/43235791" title="编辑">编辑</a> 
  47.         </span> 
  48.              
  49.         <span class="link_delete"><a href="javascript:void(0);" onclick="javascript:deleteArticle(43235791);return false;" title="删除">删除</a> 
  50.         </spa    </div> 
  51.  
  52.     <div class="clear"> 
  53.     </div> 
  54. </div>"""  
  55.     req = urllib2.Request("http://blog.csdn.net/gatieme/article/list/1")                # 建立页面请求  
  56.     req.add_header("User-Agent""Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)")  
  57.               
  58.     try:  
  59.         cn = urllib2.urlopen(req)  
  60.         page = cn.read( )  
  61.         unicodePage = page.decode("utf-8")  
  62.         cn.close( )  
  63.     except urllib2.URLError, e:  
  64.         print 'URLError:', e.code  
  65.         return  
  66.     except urllib2.HTTPError, e:  
  67.         print 'HTTP Error:' + e.reason  
  68.         return     
  69.   
  70.     # 从博客页面中匹配出每个博客的地                                                                           址  
  71.     reHtml = r'<span class="link_title"><a href="(.*?)">\s*(.*?)\s*</a></span>.*?<span class="link_postdate">(.*?)</span>\s*<span class="link_view" title=".*?"><a href="(.*?)" title=".*?">.*?</a>(.*?)</span>\s*<span class="link_comments" title=".*?"><a href="(.*?)#comments" title=".*?" onclick=".*?">.*?</a>(.*?)</span>'  
  72. #####-----------------------------------------------------------    
  73.     # [示例1]----写法1 匹配失败, 无法匹配中文  
  74.     # pattern = re.compile(reHtml)  
  75.     # myItems = re.findall(pattern, unicodePage)    
  76.   
  77.     # [示例1]----写法2 匹配失败, 无法匹配中文  
  78.     # myItems = re.findall(reHtml, unicodePage)     
  79. #####-----------------------------------------------------------  
  80.   
  81. #####-----------------------------------------------------------  
  82.     # [示例2]----写法1, 匹配成功, re.S使用DOTALL模式可以匹配中文  
  83.     # 写法说明    
  84.     #   Ⅰ将字符串编译成re.S[DOTALL]模式下正则表达式  
  85.     #   Ⅱ在使用正则表达式文本或者HTML代码中匹配博客信息  
  86.     pattern = re.compile(reHtml, re.S)  
  87.     myItems = re.findall(pattern, unicodePage)  
  88.    
  89.     # [示例2]----写法2, 匹配成功, re.S使用DOTALL模式可以匹配中文  
  90.     #   Ⅰ将字符串编译成re.S[DOTALL]模式下正则表达式  
  91.     #   Ⅱ直接用编译好的正则表达式在文本或者HTML代码中匹配博客信息  
  92.     # pattern = re.compile(reHtml, re.S)  
  93.     # myItems = pattern.findall(unicodePage)  
  94.   
  95.     # [示例2]----写法3, 匹配成功, re.S使用DOTALL模式可以匹配中文  
  96.     #   Ⅰ  
  97.     #   Ⅱ不编译正则表达式,直接在文本或者HTML代码中匹配博客信息  
  98.     # myItems = re.findall(reHtml, unicodePage, re.S)  
  99.   
  100.     print len(myItems)  
  101.     # print myItems  
  102.     for item in myItems:  
  103.         urlTitle = item[0].replace("\n", "")  
  104.         urlView = item[3].replace("\n", "")  
  105.         urlComments = item[5].replace("\n", "")  
  106.         # 由于匹配时使用了贪婪模式, 为了匹配出现错误,  
  107.         # 将某一篇的标题与另一篇博客的发表时间, 阅读次数或者评论条数混淆的匹配成一篇博客信息  
  108.         # 因此在匹配时,重复的匹配了博客的地址信息  
  109.         # 当且仅当,博客标题附带的地址信息与博客阅读次数以及评论条数附带的地址信息时同一篇博客的地址时,  
  110.         # 我们才认为匹配成功  
  111.         if (urlTitle == urlView) and (urlTitle == urlComments):  
  112.             print "#------------------------------------------------------"  
  113.             print "地址:", item[0].replace("\n", ""),       # 博客地址URL1(标题附带)  
  114.             print "标题:", item[1].replace("\n", ""),         # 博客标题  
  115.             print "时间:", item[2].replace("\n", ""),         # 博客发表时间  
  116.             print "阅读:", item[4].replace("\n", ""),         # 博客阅读次数信息  
  117.             print "评论:", item[6].replace("\n", "")         # 博客评论条数  
  118.             print "#-----------------------------------------------------"  
  119.             print   
  120.             print   
  121.   
  122.   
  123. if __name__ == "__main__" :  
  124.     # 测试正则表达式  
  125.   
  126.     reload(sys)  
  127.     sys.setdefaultencoding("utf-8")  
  128.   
  129.     TestReChinese( )  


转载:http://blog.csdn.net/gatieme/article/details/43275077

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python 正则表达式 re
Python 正则表达式 re
15 0
Python 使用re和urllib遍历和下载网页中所有图片
Python 使用re和urllib遍历和下载网页中所有图片
13 0
Python re模块 —— 从零基础开始入门正则表达式
Python re模块 —— 从零基础开始入门正则表达式
21 0
Python高阶教程—正则表达式RE讲解
Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
37 0
Python实战:使用re正则库匹配url中的id信息
Python实战:使用re正则库匹配url中的id信息
27 0
Python re 正则表达式 数据匹配提取 基本使用
模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。 多数字母和数字前加一个反斜杠时会拥有不同的含义。 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。 反斜杠本身需要使用反斜杠转义。 正则表达式通常都包含反斜杠"\\"以及小括号"\(\)",模式元素(如 r'\t',等价于 '\\t')匹配相应的特殊字符。
81 0
python——正则表达式(re模块)
python——正则表达式(re模块)
62 0
python re模块正则表达式详解(2)
python re模块正则表达式详解(2)
62 0
python re模块正则表达式详解(1)
python re模块正则表达式详解(1)
58 0
re库:Python中正则表达式的处理与应用(二)
re库:Python中正则表达式的处理与应用(二)
66 0
+关注
shy丶gril
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
双剑合璧-Python和大数据计算平台的结合
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多