Python正则表达式学习

正则表达式:

        世界上信息非常多,而我们关注的信息有限。假如我们希望只提取出关 注的数据,此时可以通过一些表达式进行提取,正则表达式就是其中一 种进行数据筛选的表达式。

         模块准备,需要用到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']

猜你喜欢

转载自blog.csdn.net/smart3s/article/details/81072358
今日推荐