正则表达式就是描述字符串排列的一套规则。主要是用于字符串的匹配。
在python中,一般我们会使用re模块实现python正则表达式的功能。
此文章我们会为大家介绍正则表达式如何去写,我们将分别从原子、元字符、模式修正符、贪婪模式与懒惰模式等方面介绍。
1.原子
原子是正则表达式中最基本的组成单位。每个正则表达式中至少要包含一个原子,常见的原子有以下几类:
1)普通字符作为原子
2)非打印字符作为原子
3)通用字符作为原子
4)原子表
a.普通字符作为原子
我们使用一些普通的字符。比如数字、大小写字母、下划线等都可以作为原子使用。
import re pattern="yue" #yue作为原子使用 string="http://yum.iqianyue.com" result1=re.search(pattern,string) print(result1)
b.非打印字符作为原子
所谓的非打印字符,指的是一些在字符串中用于格式控制的符号。例如换行符 “\n” 制表符 “\t”
import re pattern="\n" string="""http://yum.iqianyue.com http://baidu.com""" result2=re.search(pattern,string) print(result2)
c.通用字符作为原子
符号 | 含义 |
\w | 匹配任意一个字母、数字或下划线 |
\W | 匹配除字母、数字和下划线以外的任意一个字符 |
\d | 匹配任意一个十进制数 |
\D | 匹配除十进制数以外的任意一个其他字符 |
\s | 匹配任意一个空白字符 |
\S | 匹配除空白字符以外的任意一个其他字符 |
import re pattern="\w\dpython\w" string="abcdfphop35pythony_pu" result4=re.search(pattern,string) print(result4)
d.原子表
[xyz]中括号中的原子可以任意匹配
[^xyz]除了中括号中的原子均可以任意匹配
2.元字符import re pattern1="\w\dpython[xyz]\w" pattern2="\w\dpython[^xyz]\w" pattern3="\w\dpython[xyz]\W" string="abcdfphp345pythony_py" result1=re.search(pattern1,string) result2=re.search(pattern2,string) result3=re.search(pattern3,string) print(result1) print(result2) print(result3)
元字符就是正则表达式中具有一些特殊含义的字符,比如重复N次前面的字符等。
符号 | 含义 |
. | 匹配除换行符以外的任意字符 |
^ | 匹配字符串的开始位置 |
$ | 匹配字符串的结束位置 |
* | 匹配0次、1次或多次前面的原子 |
? | 匹配0次或1次前面的原子 |
+ | 匹配1次或多次前面出现的原子 |
{n} | 前面的原子恰好出现n次 |
{n,} | 前面的原子至少出现n次 |
{n,m} | 前面的原子至少出现n次,至多出现m次 |
| | 模式选择符 |
() | 模式单元符 |
a.任意匹配元字符
#“.”匹配一个除换行符以外的任意字符 import re pattern=".python..." string="abcdfphp345pythony_py" result=re.search(pattern,string) print(result)
b.边界限制元字符
#"^"用于匹配字符串的开始,“$”用于匹配字符串的结束 import re pattern1="^abc" pattern2="^abd" pattern3="py$" pattern4="ay$" string="abcdfphp345pythony_py" result1=re.search(pattern1,string) result2=re.search(pattern2,string) result3=re.search(pattern3,string) result4=re.search(pattern4,string) print(result1) print(result2) print(result3) print(result4)
c.限定符
#*,?,+,{n},{n,},{n,m} import re pattern1="py.*n" pattern2="cd{2}" pattern3="cd{3}" pattern4="cd{2,}" string="abcdddfphp345pythony_py" result1=re.search(pattern1,string) result2=re.search(pattern2,string) result3=re.search(pattern3,string) result4=re.search(pattern4,string) print(result1) print(result2) print(result3) print(result4)
d.模式选择符
#\匹配时,可以从中选择任意一个模式匹配;输出向匹配成功的 import re pattern="python|php" string="abcdddfphp345pythony_py" result1=re.search(pattern,string) print(result1)
e.模式单元符
#()将一些原子组合成一个大原子使用,小括号括起来的部分会被当做一个在整体去使用 import re pattern1="(cd){1,}" pattern2="cd{1,}" string="abcdcdcdcdcdfphp345pythony_py" result1=re.search(pattern1,string) result2=re.search(pattern2,string) print(result1,result2)
3.模式修正
模式修正符,就是可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整。
符号 | 含义 |
I | 匹配时忽略大小写 |
M | 多行匹配 |
L | 做本地化识别匹配 |
U | 根据unicode字符及解析字符 |
S | 让.匹配包括换行符,即用了该模式修正后,“.”匹配就可以匹配任意的字符了 |
import repattern1="python"string="abcdcdcdcdcdfphp345Pythony_py"result1=re.search(pattern1,string)result2=re.search(pattern1,string,re.I)print(result1,result2)
4.贪婪模式与懒惰模式贪婪模式的核心点就是尽可能多的匹配;懒惰模式的核心点是尽可能少的匹配;就近匹配
#贪婪模式和懒惰模式 import re pattern1="p.*y" #贪婪模式 pattern2="p.*?y" #懒惰模式 就近匹配原则 string="abcdcdcdcdcdfphp345Pythony_py" result1=re.search(pattern1,string) result2=re.search(pattern2,string) print(result1,result2) #<_sre.SRE_Match object; span=(13, 29), match='php345Pythony_py'> <_sre.SRE_Match object; span=(13, 21), match='php345Py'>
正则表达式常见函数
1.re.match()函数
从源字符串的起始位置匹配一个模式
re.match()函数的使用格式是:
re.match(pattern,string,flag)
第一个参数代表对应的正则表达式,第二个参数代表对应的源字符,第三个参数是可选参数,代表对应的标志位,可以放模式修正符等信息。
import re string="apythonhellomypythonhispythonourpythonend" pattern=".python." result=re.match(pattern,string) result1=re.match(pattern,string).span() print(result,result1) #<_sre.SRE_Match object; span=(0, 8), match='apythonh'> (0, 8)
2.re.search()函数匹配函数。re.match()函数从源字符串的开头进行匹配。而re.search()函数会在全文中进行检索并匹配。
import re string="hellomypythonhistorypythonourpythoned" pattern=".python." result=re.match(pattern,string) result1=re.search(pattern,string) print(result,result1) #None <_sre.SRE_Match object; span=(6, 14), match='ypythonh'>
3.全局匹配函数在match(),search()函数中,都只会匹配一个结果。下面就是将符合模式的内容全部都匹配出来。
思路如下:
1)使用re.compile()对正则表达式进行预编译
2)编译后,使用findall()根据正则表达式从源字符串中将匹配的结果全部找出。
import re string="hellomypythonhistorypythonourpythoned" pattern=re.compile(".python.")#预编译 result=pattern.findall(string)#找出符合模式的所有结果 #pattern=".python."#预编译 #result=re.compile(pattern).findall(string)#找出符合模式的所有结果 print(result)
4.re.sub()函数
根据正则表达式来实现替换某些字符串的功能。
re.sub()函数格式如下:
re.sub(pattern,rep,string,max)
第一个参数为对应的正则表达式,第二个参数为要替换成的字符串,第三个参数为源字符串。
第四个参数为可选项,代表最多替换的次数,如果忽略不写,则符合模式的结果都将被替换。
import re string="hellomypythonhistorypythonourpythoned" pattern="python." result1=re.sub(pattern,"php",string) #全部替换 result2=re.sub(pattern,"php",string,2) #最多替换两次 print(result1) print(result2) #hellomyphpistoryphpurphpd #hellomyphpistoryphpurpythoned
常见实例分析
例1:匹配.com或.cn后缀的URL网址import re pattern="[a-zA-Z]+://[^\s]*[.com|.cn]" string="<a href= http://www.baidu.com >百度首页</a>" result=re.search(pattern,string) print(result) #<_sre.SRE_Match object; span=(9, 29), match='http://www.baidu.com'>
例2:匹配电话号码
import re pattern="\d{4}-\d{7}|\d{3}-\d{8}" #匹配电话号码的正则表达式 string="021-6728263653682382265236" result=re.search(pattern,string) print(result)
例3:匹配电子邮件地址
import re pattern="\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*" string="webmaster@csdn.net" result=re.search(pattern,string) print(result)
Cookie简单的说,如果没有cookie,我们登录成功了一个网页,但如果我们需要去爬取该网站的其他网页,仍然是未登录状态,
如果有cookie,我们登录成功后,爬取该网站的其他网页,则会保持登录状态进行内容的爬取。
如果希望登录状态一直保持,则需要进行cookie处理。
进行cookie处理的一种常用思路如下:
1)导入cookie处理模块http.cookiejar
2)使用http.cookiejar.CookieJar()创建CookieJar对象
3)使用HTTPCookieProcessor创建cookie处理器,并以其为参数构建opener对象。
4)创建全局默认的opener对象。
———来自《精通python网络爬虫》第五章的读书笔记