正则表达式:
世界上信息非常多,而我们关注的信息有限。假如我们希望只提取出关 注的数据,此时可以通过一些表达式进行提取,正则表达式就是其中一 种进行数据筛选的表达式。
模块准备,需要用到re模块,为Python自带:
>>> import re
一、原子:
原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含 一个原子。常见的原子类型有:
a.普通字符 b.非打印字符 c.通用字符 d.原子表
实例:
(1)普通字符作为原子:
>>> #匹配到的情况
>>> import re
>>> pat="baidu"
>>> string="http://www.baidu.com"
>>> rst1=re.search(pat,string)
>>> print(rst1)
<_sre.SRE_Match object; span=(11, 16), match='baidu'>
>>> #匹配不到的情况
>>> string2="abcdefg"
>>> rst2=re.search(pat,string2)
>>> print(rst2)
None
(2)非打印字符作为原子:以‘\n’换行符为例
>>> pat2="\n"
>>> #注意当字符串中有换行要用三引号括起来
>>> string3='''asfasfsafasfsaf
asfassssfwef'''
>>> rst3=re.search(pat2,string3)
>>> print(rst3)
<_sre.SRE_Match object; span=(15, 16), match='\n'>
(3)通用字符作为原子:
\w 匹配字母、数字、下划线;\d 匹配任意一个十进制数,\s 匹配空白字符;\W匹配除字母、数字、下划线之外的任意字符,\D匹配除十进制数之外的字符;\S匹配除空白字符之外的字符。
>>> #匹配不到的情况
>>> pat3="\w\dpython\w"
>>> string="easfasgasasdasf"
>>> rst3=re.search(pat3,string)
>>> print(rst3)
None
>>> #匹配到的情况
>>> string="dasfasfasfa7pythonkasfds"
>>> rst3=re.search(pat3,string)
>>> print(rst3)
<_sre.SRE_Match object; span=(10, 19), match='a7pythonk'>
另外,[***]表示匹配中括号内任意一个字符,如[abc]表示匹配a或b或c,例:
>>> 匹配到的情况
>>> pat="pyth[jsz]n"
>>> string="zjhsklsgajhslagpythsnasgasg"
>>> rst3=re.search(pat,string)
>>> print(rst3)
<_sre.SRE_Match object; span=(15, 21), match='pythsn'>
>>> #匹配不到的情况
>>> string="zjhsklsgajhslagpythjsnasgasg"
>>> rst3=re.search(pat,string)
>>> print(rst3)
None
二、元字符:
所谓的元字符,就是正则表达式中具有一些特殊含义的字符,比如重复 N次前面的字符等,常见类型有:
(1).:匹配除换行符外任意字符
(2)^:匹配待搜索字符串开始位置
(3)$:匹配结束位置 *:匹配零次一次或多次,如S*,可匹配SS,SSS,SSSSS
(4)?:匹配一次或者零次
(5)+:匹配一次或多次(无零次)
(6){}:匹配出现次数,如t{6} 恰好有连续的6个t能够匹配,t{6,}至少出现了6次,t{4,7}至少4次至多7次
(7) | 模式选择符或,如 t|s 即t或s可以匹配
(8)() :用于提取某一内容
实例:
(1)用 . 匹配
>>> pat=".python..."
>>> string="asfasfapythonsgasggs"
>>> rst=re.search(pat,string)
>>> print(rst)
<_sre.SRE_Match object; span=(6, 16), match='apythonsga'>
(2)用 | 匹配
pat="python|php"
>>> string="abcdphp5267pythonjsajkas"
>>> rst=re.search(pat,string)
>>> print(rst)
<_sre.SRE_Match object; span=(4, 7), match='php'>
注:只匹配了前面出现第一次的结果,search方法的特色,可用.compile().findall()解决,后面会有相关实例。
三、模式修正符:
所谓的模式修正符,即可以在不改变正则表达式的情况下,通过模式修 正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能,常见类型有:
(1)I:不区分大小写
(2)M:进行多行匹配
(3)L:本地化识别匹配
(4)U:根据Unical字符解析字符
(5)S:让.也能匹配换行符
实例:
>>> pat1="python"
>>> pat2="python"
>>> string="asdfasfasasPythonasda"
>>> rst=re.search(pat1,string)
>>> print(rst)
None
>>> rst=re.search(pat2,string,re.I)
四、贪婪模式与懒惰模式:
贪婪模式的核心点就是尽可能多的匹配,而懒惰模式的核心点就是尽可 能少的匹配。
实例:
>>> pat1="p.*y" #贪婪模式,尽可能多
>>> string="agassgpythonvsfdpy"
>>> rst=re.search(pat1,string)
>>> print(rst)
<_sre.SRE_Match object; span=(6, 18), match='pythonvsfdpy'>
>>> pat2="p.*?y"#懒惰模式,尽可能少
>>> string="agassgpythonvsfdpy"
>>> rst2=re.search(pat2,string)
>>> print(rst2)
<_sre.SRE_Match object; span=(6, 8), match='py'>
五、正则表达式函数:
常见有re.match()函数、re.search()函数、全局匹配函数、 re.sub()函数
re.search() :从左往右搜索,位置没有要求。
re.match() : 从头开始搜索,如匹配"PY","saoPY"匹配失败,"PYss"匹配成功。
全局匹配函数:re.complie(pat).findall(string),可以匹配多次出现的字符。
(1)re.search的缺点,只出现一个结果,例如:
>>> pat1="p.?y"
>>> string="asdasdpasdyasdpsey"
>>> rst=re.search(pat1,string)
>>> print(rst)
<_sre.SRE_Match object; span=(6, 11), match='pasdy'>
(2)全局匹配函数实例:
>>> pat1="p.*?y"
>>> string="asdasdpasdyasdpsey"
>>> rst2=re.compile(pat1).findall(string)
>>> print(rst2)
['pasdy', 'psey']
六、实例:匹配百度网址:
>>> pat="[a-zA-Z]+://[^\s]*[.com|.cn]"
>>> string='<a href="http://www.baidu.com>hasdad</a>'
>>> rst=re.compile(pat).findall(string)
>>> print(rst)
['http://www.baidu.com']