200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Python之网络爬虫---正则表达式

Python之网络爬虫---正则表达式

时间:2019-12-01 18:19:03

相关推荐

Python之网络爬虫---正则表达式

文章目录

1.网络爬虫概念2.正则表达式2.1 原子2.2 元字符2.3 模式修正符2.5 正则表达式函数 3. 案例3.1 实例之匹配`.com`和`.cn`网址3.2 实例之匹配电话号码3.3 实战之爬取网址上的QQ号

1.网络爬虫概念

说明:网络爬虫就是从互联网中定向或者不定向的采集信息的一种程序。网络爬虫有很多类型:通用网络爬虫、聚焦网络爬虫等等

应用:

(1)搜索引擎

(2)采集金融数据

(3)采取商品信息

(4)自动过滤广告

(5)采集信息,进行相关数据分析等等

2.正则表达式

说明:要用正则表达式,要导入模块import re

2.1 原子

说明:是正则表达式中最基本的单位,每个正则表达式中至少要包含一个原子,常见的原子有:普通字符作为原子、非打印字符作为原子,通用字符作为原子、原子表四类。

eg:

import restr = 'Hello123Python!'#1.普通字符作为原子pat = '123'#pat为正则表达式result = re.search(pat, str)print(result)#2.非打印字符作为原子#换行符:\n 制表符:\tpat2 = '\n'print(re.search(pat2, str))#3.通用字符作为原子'''\w 字母、数字、下划线\W 非字母、数字、下划线\d 十进制数\D 非十进制数\s 空白字符\S 非空白字符'''pat3 = '\w\d\d'print(re.search(pat3, str))#4.原子表pat4 = '\w[139]\d'#[139]表示一个原子表,匹配时从中选一个符合要求的原子,若没有,返回Noneprint(re.search(pat4, str))#^符号表示非pat5 = 'l[^alo]' #表示除了原子表[alo]内的元素外我都可以提取print(re.search(pat5, str))#结果:<re.Match object; span=(5, 8), match='123'>None<re.Match object; span=(4, 7), match='o12'><re.Match object; span=(4, 7), match='o12'>None

2.2 元字符

说明:元字符就是正则表达式中具有一些特殊含义的字符。

.表示除换行符以外的任何一个字符^表示后一个原子处于开始位置$表示前一个原子处于结束位置*表示前面的原子接着出现01多次?表示前面的原子接着出现01+表示前面的原子接着出现1多次{n}表示前面一个原子出现恰好n次(操作时n用具体的数字代替){n,}表示前面一个原子出现至少n次{n, m}表示最少匹配 n 次且最多匹配 m 次|表示模式选择或,[.com|.cn]表示为.com.cn,"\da|\db"表示为\da\db()表示模式单元,直接提取正则式中的某部分

eg:

import restr = 'Hello1ooo123Python!'pat = '^He..'#pat为正则表达式result = re.search(pat, str)print(result)pat2 = '..on!$'#pat2为正则表达式result = re.search(pat2, str)print(result)pat3 = '1o*'#pat3为正则表达式result = re.search(pat3, str)print(result)pat4 = 'e.*'#pat4为正则表达式result = re.search(pat4, str)print(result)pat5 = '1o{4}'#pat5为正则表达式result = re.search(pat5, str)print(result)pat6 = 'o(\d*?)P'result = pile(pat6).findall(str)print(result)#结果:<re.Match object; span=(0, 4), match='Hell'><re.Match object; span=(14, 19), match='thon!'><re.Match object; span=(5, 9), match='1ooo'><re.Match object; span=(1, 19), match='ello1ooo123Python!'>None['123']

2.3 模式修正符

字母I匹配时忽略大小写字母S.能够匹配换行符字母M多行匹配字母Uunicode字母L本地化识别匹配

注意:以上字母必须为大写

eg:

import restr = 'Hello1ooo123Python!'pat = 'hell'#pat为原子result = re.search(pat, str, re.I)print(result)str = '''Hello1ooo123Python!'''pat = 'oo.1'#pat为原子result = re.search(pat, str, re.S)print(result)#结果:<re.Match object; span=(0, 4), match='Hell'><re.Match object; span=(7, 11), match='oo\n1'>

(4)贪婪模式与懒惰模式

说明:

贪婪模式就是尽可能多的匹配,语法.*\d*等等,就是元字符或原子与符号*的组合懒惰模式就是尽可能少的匹配,语法.*?\d*?等等,就是元字符或原子与符号*?的组合

eg:

import restr = 'HelloPython!'pat = 'H.*o'#贪婪模式pat2 = 'H.*?o'#懒惰模式result = re.search(pat, str)result2 = re.search(pat2, str)print(result)print(result2)#结果:<re.Match object; span=(0, 10), match='HelloPytho'><re.Match object; span=(0, 5), match='Hello'>

2.5 正则表达式函数

re.match()函数,对数据从头开始匹配,结果只有一个re.search()函数,任意位置匹配,结果只有一个全局匹配函数,任意位置匹配,结果是一个list,语法:pile(正则表达式).findall(数据)re.sub(正则表达式, 字符串, 数据)函数,任意位置匹配,结果是多个,用指定的字符串代替匹配到的字符串

eg:

import re#match()函数str = 'HelloPython!'pat = 'H.*?o'#懒惰模式print(re.match(pat, str))pat = 'h.*?o' print(re.match(pat, str))str = 'HelloHsadoHazzzoHo'pat = 'H.*?o'print(re.match(pat, str))#全局匹配函数result = pile(pat).findall(str)print(result)#sub()函数out = re.sub(pat, 'J', str)print(out)#结果:<re.Match object; span=(0, 5), match='Hello'>None<re.Match object; span=(0, 5), match='Hello'>['Hello', 'Hsado', 'Hazzzo', 'Ho']JJJJ

re.sub()函数能替换所有符合要求的正则表达式,下面举一个清洗数据的例子:

import restr = '<a>abc<b>defg<c>'pat = '<.*?>'data = re.sub(pat, '', str)print(data)# 结果:abcdefg

3. 案例

3.1 实例之匹配.com.cn网址

eg:

import restr = '<a href=>百度首页</a>'#[a-zA-Z]表示从a到z和A到Z的所有字母#|为模式选择或 [.com|.cn]表示为.com或.cnpat = '[a-zA-Z]+://[^\s]*[.com|.cn]'print(pile(pat).findall(str))#结果:['']

3.2 实例之匹配电话号码

说明:电话号码有两种

前3位为域名+后8位前4位为域名+后7位

eg:

import restr = 'dsadasdgs031-1564653233adads2312-24644567dZDxz'pat = '\d{3}-\d{8}|\d{4}-\d{7}'print(pile(pat).findall(str))#结果:['031-15646532', '2312-2464456']

3.3 实战之爬取网址上的QQ号

eg:爬取该网址内的QQ号

#简单爬虫编写,自动爬取上面两个QQ号import urllib.requestimport redata = urllib.request.urlopen("/python3").read().decode("utf-8") #decode()函数是设置读取编码格式pat = 'QQ群:(\d*)'result = pile(pat).findall(data)print(result)#结果:['227270512', '479429477']#简单爬虫编写,自动爬取该网页所有QQ群import urllib.requestimport redata = urllib.request.urlopen("/python3").read().decode("utf-8") #decode()函数是设置读取编码格式pat = '[1-9]{6,10}'result = pile(pat).findall(data)# 去除重复的QQ号result = list(set(result))print('该网站共有'+str(len(result))+'个QQ群:')print(result)# 结果:该网站共有17个QQ群:['769728683', '65515455', '5798217', '415553199', '1932146371', '6215498', '175248146', '9485766451', '944874', '6494738921', '456236', '816911', '629264796', '153241', '397883996', '479429477', '851549']

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。