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

    一: re.findall

    def findall(pattern, string, flags=0):
    pattern: 正则表达式
    string: 要匹配的字符串
    flag:


    返回结果:如果能够匹配到字符串,会将所有匹配到的字符串形成一个列表,然后返回,如果匹配不到,则返回一个空列表
    import re
    ret1=re.findall('[a-z]+','wangys wc')
    ret2 =re.findall('[0-9]','wangys')
    print(ret1)
    print(ret2)
    
    # 结果
    ['wangys', 'wc']
    []

    使用分组匹配的时候要注意优先级匹配,需要将优先级取消,才能取得正确的值

    import re
    
    # 正常匹配
    ret=re.findall('d+ww+','123wangys')
    print(ret)
    # ['123wangys']
    
    # 使用分组正常匹配
    ret1=re.findall('d+(ww+)','123wangys')
    print(ret1)
    # ['wangys']  # 结果不正常
    
    # 使用分组匹配取消优先级匹配  ?:取消优先级
    ret1=re.findall('d+(?:ww+)','123wangys')
    print(ret1)
    ['123wangys']

    二:re.search

    def search(pattern, string, flags=0):
    pattern: 正则表达式
    string: 要匹配的字符串
    flag:

    返回结果: 通过正则表达式匹配字符串,如果有匹配到一个就返回,返回的结果是包含匹配的字符串的对象,字符串可以使用group()的方法取得,如果没有匹配到返回None,在使用group方法时会报错


    import re
    ret1=re.search('[a-z]+','wangys,xiaogongzu')
    print(ret1)
    print(ret1.group())
    
    # <_sre.SRE_Match object; span=(0, 6), match='wangys'>  # 如果匹配到就返回一个对象
    # wangys  # 使用group方法可以得到这个匹配结果,从结果上看,确实时第一个匹配结果会返回,后续的不会做为返回值返回
    
    
    ret2=re.search('d+','wangys,xiaogongzu')
    print(ret2)
    print(ret2.group())
    
    #None # 如果匹配不到就返回None
    # AttributeError: 'NoneType' object has no attribute 'group' # 当使用group方法会报错
    # 在输出字符串之前使用group之前对结果进行判断
    # 要么返回一个对象,要不返回None,
    # None为false
    
    import re
    ret = re.search('[a-z]+','wangys anyl')
    if ret:
        print(ret.group())
    
    ret = re.search('[0-9]+','wangys anyl')
    if ret:
        print(ret.group())

     三:re.match

    match(pattern, string, flags=0)
    pattern: 正则表达式
    string: 要匹配的字符串
    flag:
    返回结果: 从字符串开始做匹配,跟search一样

    ret1=re.match('[a-z]+','wangys,xiaogongzhu')
    print(ret1)
    print(ret1.group())
    
    # <_sre.SRE_Match object; span=(0, 6), match='wangys'>
    # wangys
    
    ret2=re.match('[a-v]+','wangys,xiaogongzhu')
    print(ret2)
    print(ret2.group())
    
    # None
    # AttributeError: 'NoneType' object has no attribute 'group'

    同样为了防止报错,当使用group方法取出匹配的字符串时,要判断返回值是否为None

    四:re.split

    split(pattern, string, maxsplit=0, flags=0)
    pattern: 正则表达式
    string: 要匹配的字符串
    maxsplit:
    flag:

    函数 re.split() 是非常实用的,因为它允许你为分隔符指定多个正则模式, 返回结果为一个字段列表,这个跟 str.split() 返回值类型是一样的
    当你使用 re.split() 函数时候,需要特别注意的是正则表达式中是否包含一个括号捕获分组。 如果使用了捕获分组,那么被匹配的文本也将出现在结果列表中



    返回结果:将使用正则表达式将字符串分隔。
    import re
    ret1 = re.split('[a-z]+','sdfasdf123sdfasf')
    print(ret1)
    ['', '123', '']

    在使用分组匹配分隔是,会将分隔符也匹配进去

    import re
    ret1=re.split('d','1wang4ys5')
    print(ret1)
    # ['', 'wang', 'ys', '']  返回结果不会带有被匹配的字符串
    
    ret1=re.split('(d)','1wang4ys5')
    print(ret1)
    # ['', '1', 'wang', '4', 'ys', '5', ''] 分组后也会将被匹配的字符串返回

    多个分隔符时效果更佳(字符串的split方法只支持 单个分隔符)

    import re
    line = 'asdf fjdk; afed, fjek,asdf, foo'
    result = re.split(r'[;,s]s*', line)
    print(result)
    result = re.split(r'(?:;|,|s)s*', line)
    print(result)

    五:re.sub

    sub(pattern, repl, string, count=0, flags=0)

    pattern: 正则表达式
    repl: 要替换的字符串
    string: 要匹配的字符串
    count:
    flag:

     用于字符串替换

    import re
    ret = re.sub('d+','wangys','123wangys')
    print(ret)
    
    # 将匹配到的数字替换成字符串‘wangys’

     六 re.subn

    subn(pattern, repl, string, count=0, flags=0)
    pattern: 正则表达式
    repl: 需要替换的字符串
    string: 要匹配的字符串
    count:
    flag:

    返回结果:替换字符串,并将结果和替换次数组成一个元祖的形式返回

    import re
    ret=re.subn('d','H','123wangys')
    print(ret)
    # ('HHHwangys', 3)
    import re
    obj = re.compile('d{3}')  # 将正则表达式编译成了一个正则对象
    ret = obj.findall('wangys123yl456') # 使用该对象匹配字符串
    print(ret) # 返回结果

    7: re.finditer

    finditer(pattern, string, flags=0)

    pattern: 正则表达式
    string: 要匹配的字符串
    flag:

    返回结果是一个迭代器,取出的值是对象,不是真正的字符串,需要使用group方法取到
    import re
    ret = re.finditer('[a-z]+','wangys123xiao')
    print(ret)
    for i in ret:
        print(i)
    
    # <callable_iterator object at 0x0000027B7C12D2B0>返回结果是一个可调用的迭代器对象
    # <_sre.SRE_Match object; span=(0, 6), match='wangys'>
    # <_sre.SRE_Match object; span=(9, 13), match='xiao'>
    
    import re
    ret = re.finditer('[a-z]+','wangys123xiao')
    print(ret)
    for i in ret:
        print(i.group())
    
    # <callable_iterator object at 0x0000024A15E9D2E8>
    # wangys
    # xiao
    flags有很多可选值:
    
    re.I(IGNORECASE)忽略大小写,括号内是完整的写法
    re.M(MULTILINE)多行模式,改变^和$的行为
    re.S(DOTALL)点可以匹配任意字符,包括换行符
    re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用
    re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag
    re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

     八:练习题

    import re
    name = "<h1>hello</h1>"
    # ret = re.search('<w+>w+</w+>',name)
    ret = re.search('<(?P<tag_name>w+)>w+</(?P=tag_name)>',name)
    print(ret.group())
    print(ret.group('tag_name'))  # 可以输出tag_name这个分组的值是多少
    # 使用序号来应用分组匹配
    import re
    name = "<h1>hello</h1>"
    ret = re.search(r'<(w+)>w+</1>',name)
    print(ret.group())
    print(ret.group(1)) # 可以通过组id取出匹配的字符串
    1、 匹配一段文本中的每行的邮箱
    http://blog.csdn.net/make164492212/article/details/51656638

    2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;

    分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
    一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$

    3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,}

    4、 匹配一个浮点数。 ^(-?d+)(.d+)?$ 或者 -?d+.?d*

    5、 匹配汉字。 ^[u4e00-u9fa5]{0,}$

    6、 匹配出所有整数
    实现能计算类似 
    1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序






  • 相关阅读:
    常用的SQL语句
    解决Pycharm中module 'pip' has no attribute 'main'的问题
    [转]如何使用Fiddler抓取指定浏览器的数据包
    Linux常用命令
    Android:JACK编译错误汇总及解决
    Linux学习:使用 procrank 测量系统内存使用情况
    Android:动态库(.so)调试技巧
    Android 显示系统:Vsync机制
    Android:cmake开发指南
    Android:高通平台性能调试
  • 原文地址:https://www.cnblogs.com/wc89/p/10313499.html
Copyright © 2011-2022 走看看