美文网首页
正则表达式(上)

正则表达式(上)

作者: 李李要努力 | 来源:发表于2019-07-16 23:58 被阅读0次

    coding=utf8

    import re
    s = "<html><body><h1>hello world<h1></body></html>"
    start=s.find('<h1>')
    print(start)

    st="aabcaaaaaaaa"
    s=r"abc"
    print(re.findall(s,st))

    元字符

    st="tip top tap tep temp"
    s=r"t[io]p" #[]用来指定字符集i和o 匹配以t开头,p结尾,中间i和o
    print(re.findall(s,st))

    s=r"t[^io]p" #过滤规则然后取反 在[]的前面加^
    print(re.findall(s,st))

    []中出现元字符将不起作用

    r=r"t[abc^]" print(re.findall(r,"ta")) #['ta'] print(re.findall(r,"tb")) #['tb'] print(re.findall(r,"tax")) #['ta'] print(re.findall(r,"t")) #['t$'] 把元字符当成了普通字符处理
    print(re.findall(r,"t^")) #['t^'] 在[]元素的后面加^表示当成普通字符串处理

    []还可以用一个大的范围

    r=r"x[0-9]x"
    print(re.findall(r,'x1x'))
    r=r"x[a-zA-Z0-9]x"
    print(re.findall(r,"xAx x0x xzx"))

    ^ 作用一般用于行首

    st="hello world,hello girl"
    r=r"hello"
    print(re.findall(r,st))

    匹配开头是hello的结果

    r =r"^hello"
    print(re.findall(r,st))

    以$符号来匹配是否以...结尾

    r=r"girl$"
    print(re.findall(r,st))

    \转义元字符

    st="^abc"
    r=r"^abc"
    print(re.findall(r,st))

    r=r"[0-9]"
    print(re.findall(r,'3333'))
    r=r"\d" # 匹配任何十进制,相当于[0-9]
    print(re.findall(r,'978675675785'))
    r=r"\D" #匹配任何非数字字符,相当于类[^0-9]
    print(re.findall(r,'908Ab更改'))
    r=r"\s" #匹配任何空白字符,相当于类[\t\n\r\f\v]
    print(re.findall(r,"908jh "))
    r=r"\S" #匹配任何非空白字符,相当于类[\t\n\r\f\v]
    print(re.findall(r,"908jh "))
    r=r"\w" #匹配任何字母数字字符,相当于类[a-zA-Z0-9_]
    print(re.findall(r,"908jhAB更改"))
    r=r"\W" #匹配任何非字母数字字符,相当于类[^a-zA-Z0-9_]
    print(re.findall(r,"908jhAB更改"))

    重复 正则表达式是能够匹配不定长的字符集

    另一个功能是可以指定正则表达式的一部分的重复次数

    mobile ="010-12345678"
    r = r"^010-\d{8}" #{}来表示\d重复的次数
    print(re.findall(r,mobile))

    r=r"ab" # * 用来指定前一个字符可以被匹配零次或多次,而不是只有一次
    print(re.findall(r,'ababbb'))
    r=r"a[abc]
    d"
    print(re.findall(r,'abcdb'))

    r=r"ab+" # + 表示匹配一次或多次 * 和+的不同:* 匹配零次或多次,而+则至少出现一次
    print(re.findall(r,'ac')) #[]
    print(re.findall(r,'abb')) #['abb']

    mobile ="010-12345678"
    r = r"^010-*\d{8}"
    print(re.findall(r,'010123456789'))
    print(re.findall(r,'010--123456789'))

    r=r"^010-?\d{8}" # ?表示指定前一个字符可以匹配一次或零次,可以用来处于标识某字符是可选
    print(re.findall(r,'01012345678'))

    r=r"ab+" #贪婪模式,最大限度的匹配所有的数据
    print(re.findall(r,'abbbbbbbbbbbb')) #['abbbbbbbbbbbb']
    r=r"ab+?" #非贪婪模式 最多匹配一次的数据
    print(re.findall(r,'abbbbb')) #['ab']

    {m,n} m和n都是十进制整数,意思是至少有m个重复,最多到n个重复

    m不指定会认为下边界是0,忽略n则是将上边界设置为无限大(至多20亿)

    {0}等同于,{1,}等同于+ ,而{0,1}则与?相同,建议最好使用、+、?

    r=r"a{1,3}" #表示a这个字符最少重复1次,最多3次
    print(re.findall(r,"sdjhfk"))

    正则的编译方法 re.compile(str) 编译后的正则要比未编译的正则匹配起来的速度快很多

    r1=r'\d{3,4}-?\d{8}'
    p_tel=re.compile(r1)
    print(p_tel.findall("010-12345678"))

    编译时可接受一些特殊的标志参数,常用来实现不同的特殊功能和语法变更

    csvt_re=re.compile(r"csvt",re.I)
    print(csvt_re.findall("Csvtcsvt"))

    反斜杠的麻烦 字符串前加“r”反斜杠就不会被任何特殊方式处理

    \section 要匹配的字符串 \section 为re.compile取消反斜杠的特殊意义

    "\\section" 为"\section"的字符串实值(string literals)取消反斜杠的特殊意义

    执行匹配

    match() 匹配要找的字符串是否在首位置,只有在首位置才会返回一个对象

    csvt_re=re.compile(r"csvt",re.I)
    print(csvt_re.match('csvt hello')) #如果存在这个字符串则返回的是一个match对象
    print(csvt_re.match("hello")) #如果不存在这个字符串则返回空
    print(csvt_re.match("hello csvt")) #如果存在的这个字符串不在首位置则返回空

    search() 扫描字符串,找到对应字符串匹配的位置返回一个对象

    csvt_re=re.compile(r"csvt",re.I)
    print(csvt_re.search('hello csvt')) #search是只要在字符串中,不论在什么位置,只要存在就返回一个对象
    print(csvt_re.search("hello")) #如果不存在这个字符串则返回空

    findall() 匹配所有的字符串,并把他们作为一个列表返回

    finditer() 匹配所有的字符串,并把他们作为一个迭代器返回(需要用迭代的方式才能从中依次把数据取出来)

    print(csvt_re.findall("Csvtcsvt hello"))
    print(csvt_re.findall("Csvt hello CSvt csVt csvt hello"))
    print(csvt_re.finditer("Csvt hello CSvt csVt csvt hello")) #是个迭代对象

    相关文章

      网友评论

          本文标题:正则表达式(上)

          本文链接:https://www.haomeiwen.com/subject/dggzhctx.html