您的位置:首页 > 理论基础 > 计算机网络

Python:入门到实现网络爬虫 Day4 --正则表达式

2017-09-30 10:21 633 查看
  这几天在笔试,面试,上课之间到处跑,终于到了周末,来继续填坑Python学习,今天是第四天了,上一次说了一些字符串的使用以及方法,前三天基础以及学得差不多了,让我们来看看Python的模式匹配与正则表达式吧。

————————————————————–10月10日更新————————————————————–

  由于正逢国庆,休息了好几天,也病了好几天,所以该篇一直未更新,今天就来更新更新吧,好久没学习了,感觉头脑都不灵活了。

正则表达式

  以前看到网上有人说熟练正则表达式可以用几行代码替代上百行代码,开始有些不信,然后去百度百科了,知道了这是一种文本模式匹配,先不用了解原理,我们来了解在Python中如何使用,正则表达式的用处十分广泛,我们可以通过表达式从网页的源代码中爬去很多数据链接或者一些信息。

一、拼写正则表达式

  http://www.runoob.com/regexp/regexp-syntax.html菜鸟教程里面的,有很多语法介绍可以去看看。

二、使用

  在脚本文件中 import re,然后就可以使用了,下面给一个简单的使用例子:

匹配电话号码

import re
str='sadsadsadsafsaf110-2220-3330dsfdsf,sdfdsfdsf333-1110sdfdsfdsfdsf'
ze=re.compile(r'(\d{3})-(\d{4}-\d{4})')  #创建一个比较模式并得到一个比较对象,()为分组的意思
mo=ze.search(str)  #比较对象调用查询方法,参数为字符串
print(mo.group())  #group参数为空输出全部,为1的话,就输出第一组
#结果为 110-2220-3330


  从上面我们看到了原字符串的使用,若不使用原字符串的话会很麻烦,不使用格式如下:

'(\\d{3})-(\\d{4}-\\d{4})'


  从上面我们就可以体验到了正则带来的好处,很快的得到上面例子中的字符串中我们想要的子串(电话号码)。

管道匹配多个分组

  字符”|”称为管道,也可以理解为或的意思,使用如下:

import re
str="Batman,Bat,Battle"
ze=re.compile(r'Bat(man|tle)|Bat')
su=ze.search(str)
print(su.group())
#结果为Batman


  如上的使用,将会匹配Batman、Battle、Bat,若他们都存在,就匹配第一次出现在字符串中的文本,如上中Batman就是第一个出现的。

问号,可选匹配

  用 ? 匹配的模式是可选的,例如

r'Bat(wo)?men'


将会匹配Batwomen或者Batmen,即wo是可选的分组,表示wo可能出现一次或者0次,若Batman和Batwoman都存在在文本中,则匹配第一个出现的。

*号匹配

  *号之前的分组,匹配0次或者多次,例如

r'Bat(wo)*man'


可以匹配到Batman,也可以匹配到Batwoman,也可以匹配到Batwowowowoman,即wo出现的次数可以为0或者多次

+号匹配

  +号之前的分组,匹配1次或者多次,即至少出现一次

{}匹配

  花括号,在第一个例子用过,如
\d{3}
匹配3个数字,我们也可以用{}来做一些*号的作用,如上面
r'Bat(wo)*man'
我们可以使用r’Bat(wo){,1}man’,第一个参数默认为0,即至少出现0次,最多出现一次,若左边的参数不添则是不限次数

贪心匹配与非贪心匹配

  Python的正则表达式默认为贪心选择,也就是尽可能匹配最长的字符串,例如:

test = re.compile(r'(Ha){3,5}')
jieguo = test.search('HaHaHaHaHa')
#jieguo.group()的结果是HaHaHaHaHa


  若在上面的正则表达式后面添加?,则是声明非贪心匹配。若?在分组之后则是表示可选的分组。

findall方法

  除了使用search查询以外,还有一个方法findall,正如其单词意义,即,找到全部结果,切返回结果是一个列表,若查询的正则表达式中有分组的话,则在列表中则以元祖,也就是数组的形式存放,如:

r'(\d{3})-(\d{3})-(\d{3})'


则返回一个数组列表,每个结果是一个数组或者说是元祖。

字符分类

\d 0-9数字,(0|1|2|3…..|9),[0-9]

\D 除了0-9数字以外的字符

\w 任何字母、数字、下划线

\W 除字母、数字、下划线以外的字符

\s 空格、制表符或者换行符

\S 除……………………………………

  我们可以使用[]来匹配我们想要匹配的,例如[aeiouAEROU]匹配所有元音字母,[0-5]匹配0到5,在[]中加入^是非的意思,[^aeiouAEROU],即是非元音字符

插入字符与美元字符

   ^字符与美元字符:

r'^hello'
#匹配以hello开头的字符
r‘hello$’
#匹配以hello结尾的字符


通配字符

   .(句点)字符为通配字符,使用如下:

test = re.compile(r'.lag')
jieguo = test.search('flag,aflag')
#jieguo.findall()结果为flag,因为.只匹配一个字符,若要匹配aflag,则r'..lag'


匹配所有字符

   使用(.*)匹配所有字符,如我们想匹配 “FristWord:…..,LastWord:…”,我们可以这样匹配:

r'FristWord:(.*) LastWord:(.*)'
#可匹配到这样的字符串'FristWord:sadsadsad LastWord:sadsadsad'


不区分大小写匹配

向re.compile中传入第二个参数re.I,则我们要匹配r’abc’,可以匹配到AbC

用sub方法替换字符串

   该方法返回替换后的字符串,使用先re.compile,然后得到的对象调用sub方法,sub的第一个参数是所要替换的(也就是将正则表达式所匹配到的替换为该字符串),第二个参数为我们要查询的字符串,使用如下:

test=re.compile(r'Agent \w+')
test.sub('GG','Agent alice abcdefg to Agent bob')
#结果GG abcdefg to GG


   若正则表达式中有分组,如上修改为r’Agent (\w)\w+’,则我们可以在sub中第一个参数写’\1’,表示第一个分组,然后(\w)将替换’\1’,以此类推’\2’,’\3’…..

4000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python