zoukankan      html  css  js  c++  java
  • re模块

    一 re模块的基础方法:

    1.findall查找 :匹配所有 每一项都是列表中的一个元素

    findall(正则表达式,待匹配的字符串,flag)

     1 ret=re.findall('d+',"sjshhdh123nd33")
     2 
     3 结果:['123'   '33']
     4 
     5 
     6 
     7 ret=re.findall('d',"sjshdh123nd33")
     8 
     9 
    10 结果:['1','2','3','3','3']
    findall查找的小例子


    search查找:只匹配从左到右的第一个,得到的不是直接结果(而是迭代器),而是一个变量,通过这个变量的group方法来获取结果.如果没有匹配到,会返回None,使用group会报错

    1 ret=re.search('d+',"jkhk172按实际花费928")
    2 print(ret)       结果的到一个内存地址,这是一个正则匹配的结果  
    3  得到:<_sre.SRE_Match object; span=(5, 8), match='172'>
    4 
    5 print(ret.group())   
    6 
    7 得到:172      (得到从左到右的第一个数字)
    search查找
    1 ret=re.search('d+',"kkhhddhjfj")    待查找的字符串中没有数字,结果会报错
    2 print(ret.grounp())
    3 
    4 结果:报错
    search查找,没有时会报错
    1 ret=re.search('d+','jkhk172按实际花费928')
    2 if ret:
    3      print(ret.grounp())
    4 
    5 
    6 
    7 结果:172
    search查找


     

    match查找:从头开始匹配,相当于search中的正则表达式加上一个^

     1 ret=re.match('d+$',"172sjkhk按实际花费928'")  'd+$' 从头开始匹配,到s时不是数字了,结果是None
     2 print(ret)
     3 
     4 
     5 结果:None
     6 
     7 
     8 
     9 
    10 ret=re.match('d+$',"172928'")  
    11 print(ret)
    12 
    13 结果:<_sre.SRE_Match object; span=(0, 6), match='172928'>
    14 
    15 print(ret.grounp)
    16 
    17 结果:172928
    match查找的例子


    二 字符串处理的方法

    1 split(切割)

    1 # s = 'alex83taibai40egon25'
    2 ret=re.split('d+',s)
    3 print(ret)
    4 
    5 
    6 结果:['alex', 'taibai', 'egon', '']
    split切割

     2 sub替换与subn替换

     1 ret=re.sub('d+','H',"alex83taibai40egon25")   用'H'来替换字符串中的数字
     2 print(ret)
     3 
     4 结果:alexHtaibaiHegonH
     5 
     6 
     7 
     8 ret =re.sub('d+','H',"alex83taibai40egon25",1)用'H'来替换字符串中的数字替换1次
     9 print(ret)
    10 
    11 结果:alexHtaibai40egon25   (83被替换掉)
    12 
    13 
    14 
    15 
    16 ret=re.subn('d+','H',"alex83taibai40egon25")   返回一个元组
    17 print(ret)
    18 
    19 结果:(alexHtaibaiHegonH,3)    返回结果的第个元素是被替换的次数
    sub与sunb的替换区别

    sub 与subn的区别:
     subn返回的结果 有被替换次数的显示,而sub只是返回结果

    三 re模块的进阶:时间/空间

    1 compile :节省你使用正则表达式解决问题的时间,编译正则表达式编译成字节码,在多次使用的过程中,不会多次编译.

     1 import re
     2 ret=compile('d+')
     3 print(ret)    结果:re.compile('\d+')
     4 res=ret.findall('alex83taibai40egon25')   使用findall查找全部数字
     5 print(res)   结果:['83', '40', '25']
     6 
     7 
     8 
     9 res = ret.search('sjkhk172按实际花费928')   找到从左到右的第一个数字172
    10 print(res.group())
    11 
    12 
    13 结果:172
    compile的编译

    2 finditer 节省你使用正则表达式解决问题的空间/内存

     1 import re
     2 ret=re.finditer('d+','alex83taibai40egon25')
     3 for i in ret:       
     4      print(i.grounp())
     5 
     6 
     7 结果:
     8 83
     9 40
    10 25
    finditer


    compile 编译一个正则表达式,用这个结果去search match findall finditer 能够节省时间

    finditer 返回一个迭代器,所有非结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存

    3 分组在re模块中的使用

     1 import re
     2 s = '<a>wahaha</a>' 
     3 ret=re.search('<w+)(w+)</(w+)>',s)
     4 print(ret.group())    显示所有的结果
     5 
     6 结果:<a>wahaha</a>
     7 
     8 
     9 print(ret.group(1))    数字参数代表的是取对应分组中的内容,取第一个分组中的内容
    10 
    11 结果:a
    12 
    13 print(ret.group(2))
    14 
    15 结果:wahaha
    16 
    17 
    18 print(ret.group(3))
    19 
    20 结果:a
    分组中的例子
     1 import re
     2 s = '<a>wahaha</a>'
     3 ret=re.findall('(w+)',s)
     4 print(ret)
     5 
     6 结果:['a', 'wahaha', 'a']
     7 
     8 ret=re.findall('>(w+)<',s)
     9 print(ret)
    10 
    11 
    12 结果:wahaha
    分组中的优先显示
    1 import re
    2 ret=re.findall('d+.d+')?','1.234*4')
    3 print(ret)
    4 
    5 结果:['.234', '']
    取消分组优先(?:正则表达式
     1 ret=re.split('d+','alex83taibai40egon25')
     2 print(ret)
     3 
     4 
     5 结果:['alex', 'taibai', 'egon', 'aa']
     6 
     7 
     8 
     9 ret=re.split('(d+)','alex83taibai40egon25')   有分组
    10 print(ret)
    11 
    12 结果:['alex', '83', 'taibai', '40', 'egon', '25', 'aa']
    split中的分组与不分组区别

    分组命名(?P<组名>正则表达式)

    1 s = '<a>wahaha</a>'
    2 ret=re.search('>(?P<vvv>w+)<',s)
    3 print(ret.group(1))
    4 print(ret.group('vvv'))   可以通过组名来获取数据
    5 
    6 结果:wahaha
    7        wahaha
    分组命名
     1 s = '<a>wahaha</a>'
     2 m='<(w+)>(w+)<(w+)>'
     3 ret=re.search(pattern.s)
     4 print(ret.group(1)==ret.group(3))
     5 
     6 结果:True
     7 
     8 
     9 
    10 pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'   也可以用分组名来判断
    11 ret = re.search(pattern,s)
    12 print(ret)
    13 
    14 
    15 结果:<_sre.SRE_Match object; span=(0, 13), match='<a>wahaha</a>'>
    判断两个元素是否一样
  • 相关阅读:
    似然函数——likelihood function
    "模式识别与机器学习"读书笔记——1.2 Probability Theory
    "模式识别与机器学习"读书笔记——1.3 Model Selection
    "模式识别与机器学习"读书笔记——1.5 Decision Theory
    C#, XML中有中文加载出错问题的处理
    如何截获浏览器的http请求——几款不错的http抓包工具
    "模式识别与机器学习"读书笔记——2 Probability Distributions
    "模式识别与机器学习"读书笔记——1.6 Information Theory
    基于TCP Socket例子
    黑客介绍跨站攻击工具XSS Shell
  • 原文地址:https://www.cnblogs.com/mlhz/p/9494527.html
Copyright © 2011-2022 走看看