花了三天时间,终于把网络爬虫和正则表达式做了个总结( 二 )


回到顶部
2.2 Python的re模块
Python通过re模块提供对正则表达式的支持 。
使用re的一般步骤是:
Step1:先将正则表达式的字符串形式编译为Pattern实例 。
Step2:然后使用Pattern实例处理文本并获得匹配结果(一个Match实例) 。
Step3:最后使用Match实例获得信息 , 进行其他的操作 。
一个使用Python的re模块进行正则表达式匹配的例子:

  1. # -*- coding: utf-8 -*- #一个简单的re实例 , 匹配字符串中的hello字符串 #导入re模块 import re # 将正则表达式编译成Pattern对象 , 注意hello前面的r的意思是“原生字符串” pattern = re.compile(r'hello') # 使用Pattern匹配文本 , 获得匹配结果 , 无法匹配时将返回None match1 = pattern.match('hello world!') match2 = pattern.match('helloo world!') match3 = pattern.match('helllo world!') #如果match1匹配成功 if match1: # 使用Match获得分组信息 print match1.group() else: print 'match1匹配失败!' #如果match2匹配成功 if match2: # 使用Match获得分组信息 print match2.group() else: print 'match2匹配失败!' #如果match3匹配成功 if match3: # 使用Match获得分组信息 print match3.group() else: print 'match3匹配失败!'
输出结果:
hello
hello
【花了三天时间,终于把网络爬虫和正则表达式做了个总结】match3匹配失败!
当然 , 也可以省略编译pattern的过程 , 如下所示:
 
# -*- coding: utf-8 -*- #一个简单的re实例 , 匹配字符串中的hello字符串 import rem = re.match(r'hello', 'hello world!') print m.group() 除了match以外 , Python中还提供了其他的匹配模式 , 可以针对不同的环境和用途来选择不同的匹配模式 。
1)match:只从字符串的开始与正则表达式匹配 , 匹配成功返回matchobject , 否则返回none;
2)search:将字符串的所有字串尝试与正则表达式匹配 , 如果所有的字串都没有匹配成功 , 返回none , 否则返回matchobject;(re.search相当于perl中的默认行为)
3)findall:匹配所有匹配成功的结果 。
详细的使用细则 , 可以查看下边的内容:
1)Python正则表达式的七个使用范例
2)Python中正则表达式教程
当然 , 如果你觉得使用正则表达式太繁琐的话 , Python提供了BeautifulSoup插件来取代正则表达式 , 进行网页的解析 。想了解有关BeautifulSoup方面的知识 , 请移至下边链接:
Python抓取网页&批量下载文件方法(正则表达式+BeautifulSoup)
回到顶部
2.3 Python正则表达式汇总
2.3.1 正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身 。一个正则表达式模式中的字母和数字匹配同样的字符串 。
多数字母和数字前加一个反斜杠时会拥有不同的含义 。
标点符号只有被转义时才匹配自身 , 否则它们表示特殊的含义 。
反斜杠本身需要使用反斜杠转义 。
由于正则表达式通常都包含反斜杠 , 所以你最好使用原始字符串来表示它们 。模式元素(如 r'/t' , 等价于'//t')匹配相应的特殊字符 。
下表列出了正则表达式模式语法中的特殊元素 。如果你使用模式的同时提供了可选的标志参数 , 某些模式元素的含义会改变 。
模式描述^匹配字符串的开头$匹配字符串的末尾 。.匹配任意字符 , 除了换行符 , 当re.DOTALL标记被指定时 , 则可以匹配包括换行符的任意字符 。[...]用来表示一组字符,单独列出:[amk] 匹配 'a' , 'm'或'k'[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 。re*匹配0个或多个的表达式 。re+匹配1个或多个的表达式 。re?匹配0个或1个由前面的正则表达式定义的片段 , 非贪婪方式re{ n} re{ n,}精确匹配n个前面表达式 。re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段 , 贪婪方式a| b匹配a或b(re)G匹配括号内的表达式 , 也表示一个组(?imx)正则表达式包含三种可选标志:i, m, 或 x。只影响括号中的区域 。(?-imx)正则表达式关闭 i, m, 或 x 可选标志 。只影响括号中的区域 。(?: re)类似 (...), 但是不表示一个组(?imx: re)在括号中使用i, m, 或 x 可选标志(?-imx: re)在括号中不使用i, m, 或 x 可选标志(?#...)注释.(?= re)前向肯定界定符 。如果所含正则表达式 , 以 ... 表示 , 在当前位置成功匹配时成功 , 否则失败 。但一旦所含表达式已经尝试 , 匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边 。(?! re)前向否定界定符 。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功(?> re)匹配的独立模式 , 省去回溯 。w匹配字母数字W匹配非字母数字s匹配任意空白字符 , 等价于 [tnrf].S匹配任意非空字符d匹配任意数字 , 等价于 [0-9].D匹配任意非数字A匹配字符串开始Z匹配字符串结束 , 如果是存在换行 , 只匹配到换行前的结束字符串 。cz匹配字符串结束G匹配最后匹配完成的位置 。b匹配一个单词边界 , 也就是指单词和空格间的位置 。例如 ,  'erb' 可以匹配"never" 中的 'er' , 但不能匹配 "verb" 中的 'er' 。B匹配非单词边界 。'erB' 能匹配 "verb" 中的 'er' , 但不能匹配 "never" 中的 'er' 。n, t, 等.匹配一个换行符 。匹配一个制表符 。等1...9匹配第n个分组的子表达式 。10匹配第n个分组的子表达式 , 如果它经匹配 。否则指的是八进制字符码的表达式 。


推荐阅读