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

05精通Python网络爬虫——正则表达式的运用

2018-03-10 00:05 531 查看
运行环境Python3.6.4

正则表达式:自定义的规则,用来描述字符串的排列,也称为模式表达式

一、正则表达式的基础知识

Python中常使用re模块实现Python的正则表达式的功能,正则表达式的书写需要知道原子、元字符、模式修正符、贪婪模式、懒惰模式等知识。

Part1 原子

原子是正则表达式中最基本的组成单位,每个正则表达式至少包含一个原子,常见为一下几类:

1)普通字符作为原子;

2)非打印字符作为原子;

3)通用字符作为原子;

4)原子表

#1.原子——普通字符作为原子(数字、大小写字母,下划线等)
import re #要使用Python中的正则表达式,就要导入re模块
pattern = "yue"#普通字符作为原子,设置正则表达式,并将值赋给变量pattern
string = "http://yum.iqianyue.com" #定义一串字符串
result1 = re.search(pattern,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
print(result1) #打印结果


#2.原子——非打印字符作为原子(格式个控制符,如\n换行符,\t制表符)
import re #要使用Python中的正则表达式,就要导入re模块
pattern = "\n"#普通字符作为原子,设置正则表达式,并将值赋给变量pattern
string = '''http://yum.iqianyue.com http://www.baidu.com'''#定义一串字符串 result1 = re.search(pattern,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
print(result1) #打印结果


#3.原子——通用字符作为原子(即一个原子可以匹配一类字符)
'''
\w——匹配任意一个字母、数字或下划线
\W——匹配除字母、数字和下划线以外的任意一个字符
\d——匹配任意一个十进制数
\D——匹配除十进制数以外的任意一个其他字符
\s——匹配任意一个空白字符
\S——匹配除空白字符以外的任意一个其他字符
'''
import re #要使用Python中的正则表达式,就要导入re模块
pattern = "\w\dpython\w"#普通字符作为原子,设置正则表达式,并将值赋给变量pattern
string = '''abcdfphp345pythony_py'''#定义一串字符串
result1 = re.search(pattern,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
print(result1) #打印结果


#4.原子——原子表(可以定义一组地位平等的原子,然后匹配的时候会取该原子表中任意的一个原子进行匹配,即多对一的匹配,[]表示
'''
[]——可以匹配[]中的任意一个字符
[^]——可以匹配除了中括号中的任意原子
'''
import re #要使用Python中的正则表达式,就要导入re模块
pattern1 = "\w\dpython[xyz]\w"#普通字符作为原子,设置正则表达式,并将值赋给变量pattern1
pattern2 = "\w\dpython[^xyz]\w"
pattern3 = "\w\dpython[xyz]\W"
string = '''abcdfphp345pythony_py'''#定义一串字符串
result1 = re.search(pattern1,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
result3 = re.search(pattern3,string)
print(result1) #打印结果
print(result2)
print(result3)


Part2 元字符

元字符——在正则表达式中具有一些特殊含义的字符,可以分为任意匹配元字符(.)、边界限制元字符(^、$)、限定符(* ? + {n} {n,} {n,m})、模式选择符|、模式单元()等

.——匹配除换行符以外的任意字符

^——匹配字符串开始的位置

$——匹配字符串结束的位置

*——匹配0次、1次或多次前面的原子

?——匹配0次或1次前面的原子

+——匹配1次或多次前面的原子

{n}——前面的原子恰好出现n次

{n,}——前面的原子至少出现n次

{n,m}——前面的原子至少出现n次,至多出现m次

|——模式选择符,可以设置多个模式,匹配时可以从中选择任意一个模式匹配

()——模式单元符,可以使用()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用

#1.元字符——任意匹配元字符(.)
import re
pattern = '.python...'
string = "abcdfphp345pythony_py"
result1 = re.search(pattern,string)
print(result1) #打印结果


#2.元字符——边界限定符(^ $)
import re
pattern1 = "^abd"#必须以'abd'开头
pattern2 = "^abc"#必须以'abc'开头
pattern3 = "py$"#必须以'py'结尾
pattern4 = "ay$"#必须以'ay'结尾
string = '''abcdfphp345pythony_py'''#定义一串字符串
result1 = re.search(pattern1,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
result3 = re.search(pattern3,string)
result4 = re.search(pattern4,string)
print(result1) #打印结果
print(result2)
print(result3)
print(result4)


#3. 元字符——限定符(* ? + {n} {n,} {n,m})
import re
pattern1 = 'py.*n'#匹配'py'和'n'之间可以是除换行符外的任意字符,该任意字符可以出现0次、1次或多次
pattern2 = 'cd{2}'#匹配'cd'字符串中的d恰好出现两次
patte
4000
rn3 = 'cd{3}'#匹配'cd'字符串中的d恰好出现3次
pattern4 = 'cd{2,}'#匹配'cd'字符串中的d至少出现2次,此时只要满足格式,就会在源字符中尽可能多的匹配字符
string = '''abcdddfphp345pythony_py'''#定义一串字符串
result1 = re.search(pattern1,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
result3 = re.search(pattern3,string)
result4 = re.search(pattern4,string)
print(result1) #打印结果
print(result2)
print(result3)
print(result4)


#4. 元字符——模式选择符(|,可以设置多个模式,匹配时可以从中选择任意一个模式匹配,优先匹配到先出现的)
import re
pattern = "python|php"
string = "abcdfphp345pythony_py"
result1 = re.search(pattern,string)
print(result1) #打印结果


#5.元字符——模式单元符'()',可以使用()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用
import re
pattern1 = '(cd){1,}' #'cd'被当做一个整体去匹配,且至少出现一次,贪婪模式
pattern2 = 'cd{1,}'#d原子至少出现1次,且贪婪模式去匹配,不会把cd看做一个整体去匹配
string = "abcdcdcdcdfphp345pythony_py"
result1 = re.search(pattern1,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
print(result1) #打印结果
print(result2)


Part3模式修正

即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整功能

I——匹配时忽略大小写

M——匹配多行

L——做本地化识别匹配

U——根据Unicode字符及解析字符

S——让.匹配包括换行符,即用了该模式修正后,”.”既可以匹配任意字符了

import re
pattern1 = "python"
pattern2 = "python"
string = "abcdfphp345Pythony_py"
result1 = re.search(pattern1,string)
result2 = re.search(pattern2,string,re.I)#第3个参数设置了模式修正re.I,即让re.search()函数执行时忽略大小写
print(result1)#None
print(result2)


Part4贪婪模式与懒惰模式

贪婪模式——尽可能多的匹配

懒惰模式——尽可能少的匹配

一般”p.y”默认为贪婪模式,只要在”.“后加上”?”就可以转化为懒惰模式

import re
pattern1 = "p.*y"#贪婪模式,就远原则,匹配到最远的y结尾字符才停止搜索匹配
pattern2 = "p.*?y"#懒惰模式,就尽原则,匹配到最近的y结尾字符就停止,可以使匹配更加精确
string = "abcdfphp345pythony_py"
result1 = re.search(pattern1,string) #运用re模块中的search()函数进行匹配,并将结果返回给变量result1
result2 = re.search(pattern2,string)
print(result1) #打印结果 <_sre.SRE_Match object; span=(5, 21), match='php345pythony_py'>
print(result2)#打印结果 <_sre.SRE_Match object; span=(5, 13), match='php345py'>


二、正则表达式常见函数

'''1. re.match()从源字符串的起始位置匹配一个模式,使用格式:re.match(pattern,string,flag)
第一个参数代表对应的正则表达式,第二个参数代表对应的源字符,
第三个参数是可选参数,代表对应的标志位,可以放模式修正符
'''
import re
string = "apythonhellomypythonhispythonyourpythonend"
pattern = ".python."
result = re.match(pattern,string) #从string起始位置进行匹配,如果不满足则返回None,符合则匹配
result2 = re.match(pattern,string).span()#将匹配到的结果在源字符中的位置赋值给result2变量
print(result)
print(result2)


#2.re.search()函数,会扫描整个字符串并进行对应的匹配,re.match()从源字符串的开头进行匹配,而re.search()会在全文中进行检索并匹配
import re
string = "hellomypythonhispythonourpythonend"
pattern = ".python."
result = re.match(pattern,string)#从源字符串的开头开始匹配
result2 = re.search(pattern,string)#从源字符串的全文进行匹配
print(result)#None
print(result2)#ypythonh


#3.全局匹配函数,re.compile()对正则表达式进行预编译,findall()根据正则表达式从源字符串中将匹配的结果全部找出
import re
string = "hellomypythonhispythonourpythonend"
pattern = re.compile(".python.")#预编译
result = pattern.findall(string) #找出符合模式的所有结果
print(result)
#将以上代码整合优化如下
import re
string = "hellomypythonhispythonourpythonend"
pattern = ".python."
result = re.compile(pattern).findall(string)
print(result)


#4.re.sub()函数,实现替换某些字符串的功能,使用格式:re.sub(pattern,rep,string,max)
'''第一个参数对应正则表达式,第二个参数对应要替换成的字符串
第三个参数为源字符串,第四个参数为可选项,代表最多替换的次数,若忽略不写,则会将所有符合模式的结果全部替换
'''
import re
string = "hellomypythonhispythonourpythonend"
pattern = "python."
result = re.sub(pattern,"php",string)#全部替换
result2 = re.sub(pattern,"php",string,2)#最多只替换2次
print(result)#hellomyphpisphpurphpnd
print(result2)#hellomyphpisphpurpythonend
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息