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
'''

 

 

 

 

 

posted @ 2017-06-07 17:04  小新丶  阅读(626)  评论(0编辑  收藏  举报