• python中的re模块和正则表达式基础


    1.正则匹配基础知识

    (1)通配符.

    .只匹配一个字符

    >>> re.findall("p.ckname","piiickname-pockname")
    ['pockname']

    如果要匹配.等特殊字符,要使用注意字符

    >>> re.findall("p.ckname","pickname--p.ckname")
    ['pickname', 'p.ckname']
    >>> re.findall("p.ckname","pickname--p.ckname")
    ['p.ckname']

    (2)字符集[],只能匹配单个字符,匹配多个见(4)

    [a-z] 可以匹配a-z之间任意一个字符 

    [a-zA-Z0-9]匹配a-z,A-Z,0-9的任意一个字符

    [^p]反转匹配,可以匹配除了p的一个字符串,注意是使用[ ]括起来的,和(5)区分出来

    #例子

    >>> re.findall("p[a-z]ckname","piickname-pockname")
    ['pockname']
    >>> re.findall("p[a-z]*ckname","piickname-pockname")
    ['piickname', 'pockname']

      >>> re.findall("p[^o]ckname","pickname-pockname")
      ['pickname']    @反转匹配

    (3)选择符 | 相当于或

    >>> re.findall("name|test","pickname-testpy")
    ['name', 'test']

    (4)可选项,注意()的使用

    ()?子模式出现0次或者1次

    ()*子模式出现0次或者多次

    ()+子模式出现1次或者多次

    (){m,n}子模式出现m-n次

    在这个模式下注意一下findall和search的结果

    >>> aa=re.search("(name){2}","myname--mynamename--my")
    >>> print aa.group()
    namename
    
    >>> re.findall("my(name){2}","myname--mynamename--my")
    ['name'] 这里匹配不到namename,需要进一步理解re的几个函数区别

    举个例子r'(http://)?(www.)?baidu.com'

    匹配结果:http://www.baidu.com

                  http://baidu.com

                  www.baidu.com

                  baidu.com

    (5)开头和结尾

    ^只想在字符串的开头匹配http  ^http

    $只想在字符串的结尾匹配http  http$

     这里要区分下不以http开头的string怎么写呢?

    [^http]要写在[  ]里面

    2.re模块

    re.compile()

    可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。

    text="hello,meixiaoer!"

    pa=re.compile('h')

    pa.match(text) 

    pa.findall(text)

    pa.search(text)

    结果:<_sre.SRE_Match object at 0x01ADF100>

             ['h']

             <_sre.SRE_Match object at 0x01A6EDE8>

     re.match()

    尝试从字符串的开始匹配一个模式,只匹配一个!

    re.match('h',text)    结果是<_sre.SRE_Match object at 0x01ADF090>

    re.match('e',text)    结果是none

    要是想打印出匹配字符可以这样

    m=re.match('h',text) 

    print m.group(0)     结果是h

    re.search()  只匹配一个!

    函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回,未匹配返回none

    >>> re.search('e',text)
    <_sre.SRE_Match object at 0x01ADF100>

    打印元素

    >>> m=re.search('e',text)
    >>> print m.group(0)
    e

    因为只匹配第一个元素,所以第二个元素会报错

    >>> m=re.search('e',text)
    >>> print m.group()
    IndexError: no such group

    re.findall()查找多有符合的元素,匹配所有,返回列表

    >>> re.findall("name","name-myname-yourname")
    ['name', 'name', 'name']
    >>> re.findall("^name","name-myname-yourname")
    ['name'] 因为^name正则表达式是从开始匹配的,可以理解下

     另一个例子更清楚的看清三个函数的区别

    #只有findall可以查找所有的
    f=re.findall('[0-9]','2fff4')
    print f #['2','4'] 返回结果是列表 
    s=re.serach('[0-9]','fff45')//查找第一个符合的以后就停止查找了
    print s.group() #4
    m=re.match('[0-9]','fff45') //从第一个字符开始匹配,符合以后就停止查询
    print m.group() #None
    m=re.match('[0-9]','1fff45')
    print m.group() #1

     ###########一些常用的使用场景#################

     1.

    #使用()进行分组
    #不使用(),表示表达式是一个组,就要使用group(0)
    m=re.match(r'd{3}-d{3,8}','010-12345')
    print m.group(0) #010-12345,ps特殊符号一遍要使用-但是-这里不使用也可以
    #如果使用(),表示表达式是有n个组的,所以要使用groups()
    m=re.match(r'(d{3})-(d{3,8})','010-12345')
    print m.groups()#('010', '12345')
    print m.group(0)#010-12345  默认组0,组0包含整个字符串
    print m.group(1)#010        组1包含第一个()内的正则
    print m.group(2)#123456     组2包含第二个()内的正则
    

    2. 分割字符应用  

    p=re.compile(r'd+')
    p.split('one1two22three333four')    #['one', 'two', 'three', 'four']
    

    两种方法,先compile后,就不用每次都运行compile了

    ss="hello,what,is,,,,,,your,,name"
    import re
    sss=re.split('[,]+',ss)
    print sss
    
    #等同于
    pa=re.compile('[,]+')
    aaa=pa.split(ss)
    print aaa

    3替换应用,最突出的就是和组结合使用

    re.sub()

    4贪婪匹配

    将贪婪比配转换成非贪婪模式?,这里注意?的位置啊

    ss='*mili*is*great*'
    #贪婪模式
    pa=re.compile(r'*(.+)*')
    print pa.match(ss).group(0)
    #*mili*is*great* 世界只想匹配*mili*,贪婪尽可能多的东西匹配


    #非贪婪模式,匹配到就停止
    pa1=re.compile(r'*(.+?)*') #这里注意下?的位置啊(.+)?这个?指的是0次或者1次,不一样的 print pa1.match(ss).group(0) #*mili*

    5 re.sub替换,模式替换

    #替换re.sub强大之处就在于替换中使用组号,默认整个字符创是group(0),1第一个()group(1)
    #re.sub(pa,repl,string,count=0) 用repl替换pa匹配的地方
    print help(re.sub)
    ss='hello, *world*'
    pa=re.compile(r'*([^*]+)*') #匹配不以*开头的字符串,^需要[^]使用
    print re.sub(pa,'hahahaha',ss)
    #hello, hahahaha
    
    
    pa1=re.compile(r'*([^*]+)*')
    print re.sub(pa,r'<h1>1</h1>',ss)
    #1第一个()group(1)
    hello, <h1>world</h1>
  • 相关阅读:
    squid详解(正向代理、透明代理、反向代理)
    kvm虚拟化管理
    centos7系统排错
    网络基础(子网划分)
    cobbler无人值守自动安装
    MSSQL提权之xp_cmdshell
    MySQL 拿 WebShell
    9
    友价商城SQL注入
    Potato土豆win综合提权
  • 原文地址:https://www.cnblogs.com/xueli/p/3709560.html
Copyright © 2020-2023  润新知