05精通Python网络爬虫——正则表达式的运用
2018-03-10 00:05
861 查看
运行环境Python3.6.4
正则表达式:自定义的规则,用来描述字符串的排列,也称为模式表达式
1)普通字符作为原子;
2)非打印字符作为原子;
3)通用字符作为原子;
4)原子表
.——匹配除换行符以外的任意字符
^——匹配字符串开始的位置
$——匹配字符串结束的位置
*——匹配0次、1次或多次前面的原子
?——匹配0次或1次前面的原子
+——匹配1次或多次前面的原子
{n}——前面的原子恰好出现n次
{n,}——前面的原子至少出现n次
{n,m}——前面的原子至少出现n次,至多出现m次
|——模式选择符,可以设置多个模式,匹配时可以从中选择任意一个模式匹配
()——模式单元符,可以使用()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个整体去使用
I——匹配时忽略大小写
M——匹配多行
L——做本地化识别匹配
U——根据Unicode字符及解析字符
S——让.匹配包括换行符,即用了该模式修正后,”.”既可以匹配任意字符了
懒惰模式——尽可能少的匹配
一般”p.y”默认为贪婪模式,只要在”.“后加上”?”就可以转化为懒惰模式
正则表达式:自定义的规则,用来描述字符串的排列,也称为模式表达式
一、正则表达式的基础知识
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
相关文章推荐
- [Python] 网络爬虫和正则表达式学习总结
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
- python之正则表达式以及网络爬虫
- Python:入门到实现网络爬虫 Day4 --正则表达式
- 用python写网络爬虫-使用xpath代替正则表达式
- Python--正则表达式/单线程网络爬虫
- python3实现网络爬虫(6)--正则表达式和BeautifulSoup配合使用
- 在学习python网络爬虫时用到的正则表达式
- python网络爬虫之正则表达式(续)
- 网络爬虫(六):Python中的正则表达式教程
- Python 网络爬虫-正则表达式、BeautifulSoup、lxml三种提取方法
- python3爬虫之入门基础和正则表达式
- python基础学习笔记05-正则表达式与json
- python爬虫入门教程--正则表达式完全指南(五)
- python 爬虫(正则表达式案例)
- Python爬虫入门七之正则表达式
- Python网络数据采集——正则表达式
- python爬虫--正则表达式
- python3爬虫之入门和正则表达式