Python-14:爬虫之正则表达式1
经过一段时间的基础知识铺垫,终于可以开始学习爬虫了,对,就是爬虫,可以爬东西的虫子!
爬虫基础,一个是Python,一个就是正则表达式了,当然,正则表达式在任何时候都不容忽视它的重要性!
接下来,我们从一个破解小密码来开始学习正则表达式
laodhfejzuwxyzixyzladivhwanxyzlovexyzawidhlxyzpythonxyzasdwia
是否破解出来了呢?
答案是: i love python
很简单:在上面一长串的字符串中,所有的密码关键字都是呈现"xyz...xyz"这个样子的,xyzixyz中可以提取出第一个密码i,依次类推可以破解该密码
好了,小游戏哈,不必太过当真,接下来开始真正的学习正则表达式
1、正则表达式的常用符号
. 可以匹配任意字符,换行符\n除外
* 匹配前一个字符0次或无限次
? 匹配前一个字符0次或1次
.* 贪心算法
.*? 非贪心算法
() 括号内的数据作为结果返回
2、正则表达式的常用方法
findall:匹配所有符合规律的内容,返回包含结果的列表
search:匹配并提取第一个符合规律的内容,返回一个正则表达式对象(object)
sub:替换符合规律的内容,返回替换后的值
#coding:utf-8 #导入正则表达式 import re #刚才我们需要破译的密码 secret_code="laodhfejzuwxyzixyzladivhwanxyzlovexyzawidhlxyzpythonxyzasdwia" #.的使用,代表占位符 a="xz123xs" b=re.findall('x.', a) print b #输出结果为['xz', 'xs'],在a这个字符串中找到x和紧跟其后的一个字符 # *的使用 a="xyxy123" b=re.findall('x*',a) print b #输出结果为['x', '', 'x', '', '', '', '', ''],因为*可以表示0个或多个,找到x的位置就显示为x,没有找到就为空 # ?的使用 a="xy123" b=re.findall('x?',a) print b #输出结果为['x', '', '', '', '', ''] '''上面的只需简单了解,下面这种重点掌握''' # .*的使用 b=re.findall('xyz.*xyz',secret_code)#从顶端的密码中查找匹配 print b #输出结果为['xyzixyzladivhwanxyzlovexyzawidhlxyzpythonxyz']贪心算法,从第一个xyz开始到最后一个xyz结束能找到多少找多少 c=re.findall("xyz.*?xyz",secret_code) print c #输出结果为['xyzixyz', 'xyzlovexyz', 'xyzpythonxyz'],非贪心算法,找尽可能多的满足条件的组合 d=re.findall("xyz(.*?)xyz",secret_code) print d #输出结果为['i', 'love', 'python'],我们需要的内容用括号包裹起来 #接下来我们把密码分开两行来显示 secret_code2='''laodhfejzuwxyzhello xyzidhlxyzpythonxyzasdwia''' e=re.findall("xyz(.*?)xyz",secret_code2) print e #输出结果为['idhl'],并不是我们想象中的hello world,原因是hello后面有一个换行符,正则表达式无法匹配,第一行和第二行无法衔接来查找匹配正则表达式 f=re.findall("xyz(.*?)xyz",secret_code2,re.S) print f #输出结果为['hello\n', 'python'],其中\n换行符就是刚才无法匹配的原因 #findall和search的区别 s2="asdfxxixx123xxlovexxdfd" a=re.search('xx(.*?)xx123xx(.*?)xx',s2).group(1) print a #输出结果为i a=re.search('xx(.*?)xx123xx(.*?)xx',s2).group(2) print a #输出结果为love group后面的数字带面前面括号中的值 a=re.findall('xx(.*?)xx123xx(.*?)xx',s2) print a #输出结果为[('i', 'love')],两个括号中的内容在一个元组中,只有这个字符串中有两个或者以上地方符合正则表达式,才会增加新的元组 #sub的使用 s="123abcssfasdfas123" output=re.sub('123(.*?)123','i love you',s) print output #输出结果为i love you,找到符合正则表达式的内容,将其整体换为新的内容
不同的导入方法
#coding:utf-8 #导入正则表达式 #import re from re import * #刚才我们需要破译的密码 secret_code="laodhfejzuwxyzixyzladivhwanxyzlovexyzawidhlxyzpythonxyzasdwia" info=findall('xyz(.*?)xyz',secret_code,S) for each in info: print each ''' 输出结果为: i love python '''