正则表达式

正则表达式就是描述字符串排列的一套规则。主要是用于字符串的匹配。

在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]除了中括号中的原子均可以任意匹配
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)


2.元字符
元字符就是正则表达式中具有一些特殊含义的字符,比如重复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 re
pattern1="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网络爬虫》第五章的读书笔记



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值