• python10——正则表达式


    1.正则表达式:

    通常被用来检索、替换那些符合某个模式的文本。

    python中增加了re模块,提供了perl风格的正则表达式模式。

    2.re模块

    re.match(pattern,string,flag)

    pattern——匹配的正则表达式

    string——要匹配的字符串

    flag——匹配方式:re.I 匹配对大小写不敏感;

              re.M 多行匹配;

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

    import re
    str = 'Python is the best language in the world'
    # match只能匹配以xxx开头的子符串,第一个参数是正则,第二个参数是需要匹配的字符串
    res = re.match('pyt' ,str,re.I)
    print(res.group()) #匹配成功使用group方法取出字符串
    import re
    str = 'Python is the best language in the world'
    res = re.match('(.*) is (.*?) .*',str,re.I|re.M)
    print(res.group(1)) #匹配成功使用group方法取出字符串
    print(res.groups(1)) #匹配成功使用groups方法取出字符串,返回一个包含所有小组字符串的元组

    常用的匹配规则:

    ①匹配字符

    .    匹配任意1个字符,除了换行符

    import re
    data = 'a1aaa'
    parrtern='...'
    res=re.match(parrtern,data)
    print(res.group())
    #输出a1a
    names='李明','小王','李达','小花','小王'
    pa='李.'
    for i in names:
        r=re.match(pa,i)
        if r:
            print(r.group())
    View Code

    [abc]  匹配abc中的任意一个字符

    import re
    str1='elloh'
    res=re.match('[he]',str1)    #简写[a-z]  
    print(res.group())    #输出e
    View Code

    d    匹配一个数字,即0-9

    import re
    str='123214loh'
    print(re.match('d',str).group())
    View Code

    D    匹配非数字,即不是数字 

    import re
    str='aa23214loh'
    print(re.match('D',str).group())
    View Code

    s    匹配空白,即空格,tab键

    S    匹配非空白,除空格,tab键

    w    匹配单词字符,及a-z,A-Z,0-9

    W   匹配非单词字符

    ②匹配数量

    *    匹配前一个字符出现0次或者无限次,即可有可无

    +      匹配前一个字符出现1次或者无限次,即至少有1次

    ?     匹配前一个字符出现1次或者0次,即要么有1次,要么没有

    {m}  匹配前一个字符出现m次  

    {m,}   匹配前一个字符至少出现m次  

    {n,m} 匹配前一个字符出现从n到m次

    import re
    res=re.match('[A-Z][A-Z]*','My')
    print(res.group())    #输出M 

    import re
    res=re.match('[A-Z][a-z]*','Myy')
    print(res.group()) #输出Myy

    ③转义字符

    在python正则中若想表示本身,应该\    或者在前面加r表示不转义

    a='F:\test\a.txt'
    print(a)
    a=r'F:	esta.txt'
    print(a)

    ④开头结尾

    ^    匹配字符串开头

    import re
    result=re.match('^P.*','Python is langage')
    if result:
        print(result.group())
    View Code

    $    匹配字符串结尾

    import re
    result=re.match('[w]{5,15}@[w]{2,3}.com$','aaaaaaaaa@163.com')
    if result:
        print(result.group())
    View Code

    ⑤分组匹配

    |       匹配左右任意一个表达式

    (ab)      将括号中字符作为一个分组

    import re
    ret= re.match('([0-9]*)-(d*)','0355-85435456')
    print(ret.group())
    View Code

    um     引用分组num匹配到的字符串

    import re
    htmlTag='<html><h1>测试数据</h1></html>'
    res=re.match(r'<(.+)><(.+)>(.+)</2></1>',htmlTag)
    print(res.group(1))
    print(res.group(2))
    print(res.group(3))
    View Code

    (?P)     分组起别名

    (?P=name)  引用别名为name分组匹配到的字符串

    import re
    ret=re.match(r'<(?P<name1>w*)><(?P<name2>w*)>.*</(?P=name2)></(?P=name1)>','<div><h1>www.baidu.com</h1></div>')
    print(ret.group())
    View Code

    re.compile方法 

    reg=re.compile(pattern)

    result=reg.match(string)

    等效于result=re.match(pattern,string)

    import re
    reobj=re.compile('d{4}')
    #开始去使用模式对象reobj
    rs=reobj.match('12346')
    print(rs.group())

    re.search方法

    在全文中匹配一次,匹配到就返回

    import re
    data='我爱伟大的祖国,I love china, China is a great country'
    rs=re.search('china',data)
    print(rs.group())

    re.findall方法

    匹配所有返回一个列表

    import re
    data='华为是华人的骄傲华侨'
    rs=re.findall('华.',data)
    rsearch=re.search('华.',data)
    print(rs)       #输出 ['华为', '华人', '华侨']
    print(rsearch)  #输出<re.Match object; span=(0, 2), match='华为'>

    re.sub方法

    将匹配到的数据进行替换

    import re
    ret=re.sub("h","H" ,'hello world')   #将原来的h替换为H
    print(ret)

    贪婪模式和非贪婪模式

    数量词默认贪婪的,总是尝试匹配尽量多的字符,非贪婪则相反,总是尝试匹配尽可能少的字符。

    在*  ?  +  {m,n}后面加上?,使贪婪变成非贪婪

    #贪婪模式匹配
    re.match( '.*d' , 'a22222').group()   ##a22222
    #加?号非贪婪模式
    re.match( '.* ?d','a11112').group()   #a1
    >>>

    实操

    1、'Save your heart for someone who cares'请使用正则将文本中的"s"替换成"S",请写Python代码完成匹配替换。

    import re
    #请使用正则将文本中的"s"替换成"S",请写Python代码完成匹配替换
    txt=re.sub('s','S','Save your heart for someone who cares')
    print(txt)
    View Code

    2、'<span三生三世,十里桃花</span><span>九州海上牧云记</span><span>莫斯科行动</span>'请使用正则将<span>标签中的全部内容匹配出来,请写Python代码完成匹配。

    import re
    data='<span>三生三世,十里桃花</span><span>九州海上牧云记</span><span>莫斯科行动</span>'
    reobj=re.compile(r'<span>(.*)</span><span>(.*)</span><span>(.*)</span>')
    result=reobj.findall(data)
    print(result)
    View Code
  • 相关阅读:
    更新主窗口控件的内容1:子线程工作时同时更新主线程内的控件内容
    静态类和非静态类中静态变量
    js $的扩展写法
    js 获取时区
    export to excel
    使用Sqlserver事务发布实现数据同步(zhuanqian)
    json to entity in api
    automapper demo
    autoMapper的介绍
    Springboot的热部署
  • 原文地址:https://www.cnblogs.com/yilia-er/p/14120515.html
Copyright © 2020-2023  润新知