zoukankan      html  css  js  c++  java
  • <Python高级全栈开发工程师-1>学习过程笔记【181-184】正则表达式 <特殊字符><函数>

    1.头文件

    import re

    2.re.findall("stra","strb",匹配模式)  在strb中找stra,返回一个列表,列表中为所有的匹配内容

    >>> re.findall("juruo","iamjuruoiamnotjuruo")
    ['juruo', 'juruo']
    >>> re.findall("juruo","iamyzw")
    []
    >>> re.search("ab","cdabcd")
    <_sre.SRE_Match object; span=(2, 4), match='ab'>
    >>> re.search("ab","cdabcd").group()
    'ab'

    2re.search("stra","strb",匹配模式)  匹配一次,返回一个search对象

    >>> re.search("ab+","abab")
    <_sre.SRE_Match object; span=(0, 2), match='ab'>

    3re.match("strb","stra",[匹配模式]) 匹配一次,且只对开头进行匹配,返回一个match对象

    >>> re.match("abc","abcde")
    <_sre.SRE_Match object; span=(0, 3), match='abc'> 
    >>> re.match("bcd","abcd") #匹配不成功返回空

     search match findall的匹配模式:

    re.I 不区分大小写

    >>> re.search("AB","12ab",re.I).group()
    'ab'
    >>> re.match("abc","ABC",re.I).group()
    'ABC'
    >>> re.findall("ab","abAB",re.I)
    ['ab', 'AB']

    re.S 使.匹配包括换行符在内的所有字符

    >>> re.search(".","
    ",re.S).group()
    '
    '
    >>> re.match("abc.","abc
    ").group()
    Traceback (most recent call last):
      File "<pyshell#75>", line 1, in <module>
        re.match("abc.","abc
    ").group()
    AttributeError: 'NoneType' object has no attribute 'group'  (报错)
    >>> re.match("abc.","abc
    ",re.S).group()
    'abc
    '
    >>> re.findall(".","abc
    ",re.S)
    ['a', 'b', 'c', '
    ']

    4.

    rearch,match对象的方法
    
    group(【参数】) 返回匹配的字符串
    
    start() 返回匹配开始的位置
    
    end() 返回匹配结束的位置
    
    span() 返回一个元组包含匹配(开始,结束)的位置
    groups() 举个栗子说明
    >>> re.search("a","bac").group()
    'a'
    >>> re.search("a","bac").start()#左闭
    1
    >>> re.search("a","bac").end()  #右开
    2
    >>> re.search("a","bac").span() #左闭右开
    (1, 2)
    >>> re.match("a","abc").group()
    'a'
    >>> re.match("a","abc").start()  #左闭
    0
    >>> re.match("a","abc").end()    #右开
    1
    >>> re.match("a","abc").span()   #左闭右开
    (0, 1)

    group()

    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group()  #默认为0
    '12abcABCD'
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(0)   #所有匹配的内容
    '12abcABCD'
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1)   #返回其中第一组匹配的内容
    '12'
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(2)   #返回其中第二组匹配的内容
    'abc'
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(3)    #返回其中第三组匹配的内容
    'ABCD'
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1,2)  #返回其中第一二组匹配的内容
    ('12', 'abc')
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(1,2,3)  #返回其中第一二三组匹配的内容
    ('12', 'abc', 'ABCD')
    >>> re.search("([0-9]*)([a-z]*)([A-Z]*)","12abcABCD").group(2,3)   #返回其中第二三组匹配的内容
    ('abc', 'ABCD')

    5 sub()  替换 re.sub("旧的","新的","str",[次数])  次数可以省略,不写时表示替换所有

    >>> re.sub("g.t","have","I get A ,I got B, I gut C")
    'I have A ,I have B, I have C'
    >>> re.sub("g.t","have","I get A ,I got B, I gut C",1)
    'I have A ,I got B, I gut C'
    >>> re.sub("g.t","have","I get A ,I got B, I gut C",2)
    'I have A ,I have B, I gut C'
    >>> re.sub("g.t","have","I get A ,I got B, I gut C",3)
    'I have A ,I have B, I have C'

    6.subn 替换,并返回替换的次数 re.sub("旧的","新的","str",[次数]) 不写次数表示替换所有

    >>> re.subn("juruo","yzw","I am juruo.My QQname is juruo,My csdn naame is juruo")
    ('I am yzw.My QQname is yzw,My csdn naame is yzw', 3)
    >>> re.subn("juruo","yzw","I am juruo.My QQname is juruo,My csdn naame is juruo",2)
    ('I am yzw.My QQname is yzw,My csdn naame is juruo', 2)

    7.compile 把正则表达式规(stra)则编成一个对象,这样可以重复利用  re.compile("正则表达式规则")

    >>> a=re.compile("b.c")
    >>> re.findall(a,"bac")
    ['bac']
    >>> a.findall("bac")  #也可以用生成的对象来调用finall方法,实际上a是在re上封装了这个规则..所以可以用findall
    ['bac']

    8.split分割   splirt("规则","str")

    '
    >>> re.split("\d+","ab1ab2ab")
    ['ab', 'ab', 'ab']
    >>> a=re.compile("\d+")  #将正则表达式规则封装成对象a 
    >>> re.split(a,"ab1ab2ab")  #使用对象a作为规则
    ['ab', 'ab', 'ab']
    >>> a.split("ab1ab2ab")    #a实际上是在re中封装规则得到的,所以可以使用split
    ['ab', 'ab', 'ab']
    >>> re.split("[ab]","cacbc")  
    ['c', 'c', 'c']

    5.二元字符 (11个)

    . ^  $ * + ?  {} [] | ()

    【.】通配符 匹配一个除了换行符外的任何字符

    【^】  re.finadall("^stra","strb")如果stra在strb的开头位置,则匹配成功

    例子: 

    >>> re.findall("^123","123456")
    ['123']
    >>> re.findall("^123","4123")
    []

    【$】 re.findall("stra$",strb"") 如果stra在strb的末尾则匹配成功

    例子:

    >>> re.findall("456$","123456")
    ['456']
    

    【* 】重复到多次   (这是一种贪婪匹配)

    >>> re.findall("abc*","abc")
    ['abc']
    >>> re.findall("abc*","abcccccc")   #贪婪匹配:它会匹配c最多的那个
    ['abcccccc']

    【+】 重复1到多次

    >>> re.findall("ax+","axxxx")
    ['axxxx']

    【?】 重复0次或1次

    >>> re.findall("ax?","a")
    ['a']
    >>> re.findall("ax?","ax")
    ['ax']
    >>> re.findall("ax?","axx")
    ['ax']

    【{}】重复指定次数   {x}重复x次  {a,b} 匹配[a,b]次(闭区间)

    >>> re.findall("ax{3}","axxxxxx")
    ['axxx']
    >>> re.findall("ax{0,3}","aaxaxxaxxx")
    ['a', 'ax', 'axx', 'axxx']

    【】 

    后面跟元字符(正则表达式特殊字符),会去除它们的特殊功能

    \引用序号对应字组所匹配的字符串

    >>> re.search("(abc)(def)\1","abcdefabc").group()   #这里(abc)是第1组 d(ef)是第2组
    'abcdefabc'
    >>> re.search("(abc)(def)\2","abcdefdef").group()
    'abcdefdef'

    d 匹配【0,9】闭区间

    D 匹配任何非数字字符 相当于[^0-9]

    s匹配任何空白字符  相当于: 空格   f v

    S匹配任何非空白字符

    w匹配任何字母数字字符 相当于【a-z】并【A-Z】并【0-9】

    W匹配任何非字母数字字符

    匹配一个单词的边界,其实是匹配字符和空格之间的位置

    就是在你匹配单个单词的时候,如果不是单个单词就不匹配

    例如:匹配I的时候有很多单词中都有I 但我指向匹配单个I 

    >>> re.search("\bI\b","IBIc I ").group()
    'I'

    【[]】 其中的一个字符 [abcdef]匹配其中的一个字符  re.findall("[stra]","strb") 一个一个字符的遍历字符串strb,然后和stra的字符进行匹配

    >>> re.findall("[abcdef]haha","ahaha")
    ['ahaha']
    >>> re.findall("[abcdef]haha","abhaha")
    ['bhaha']

    []中的(元字符)特殊字符全部变成普通字符

    >>> re.findall("a[.]b","aab")
    [] #没有起到通配符的作用
    >>> re.findall("a[.]b","a.b")  #和.匹配
    ['a.b']

    []中-起到至的作用

    >>> re.findall("[a-z]","abcdefg")#一个一个字符遍历"abcdefg"进行匹配

    ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    >>> re.findall("[0-9]","0123456789") 
    [
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

    []中^起到非的作用  [^1-9]除了1到9的数字都被匹配

    >>> re.findall("[^1-9]","12345abc")
    ['a', 'b', 'c']

    【()】作为一个整体进行处理

    【|】或

     6.非贪婪

    从前面看 ? + *都是贪婪匹配

    首先看贪婪模式

    >>> re.search("ad+","a23b")
    <_sre.SRE_Match object; span=(0, 3), match='a23'>
    >>> re.search("ad+","a23b").group()
    'a23'
    >>> re.search("ad+","a2312345").group()
    'a2312345'

    非贪婪模式

    >>> re.search("ad+?","a2312345").group()
    'a2'
    >>> re.search("ad*?","a2312345").group()
    'a'

    注意有这种特殊情况:

    需要费贪婪匹配的东西夹在中间是不行的,会匹配所有的

    >>> re.search("a(d+?)b","a23b").group()
    'a23b'

    7.

  • 相关阅读:
    UVa-10317
    UVa-1595
    UVa-10391
    UVa-10763
    UVa-10935
    UVa-1594
    UVa-1593
    从CSDN搬过来了
    memset会显著增加时间和空间的消耗吗
    memset对数组的初始化
  • 原文地址:https://www.cnblogs.com/iamjuruo/p/7355451.html
Copyright © 2011-2022 走看看