• 正则表达式常用示例


    import re
    
    """
       使用match方法进行匹配
       result = re.match(正则表达式,要匹配的字符串)
       如果match匹配到数据的话,就可以使用group方法提取数据
    
       注: 若字符串匹配正则表达式,则match方法返回匹配对象(Match Object), 否则返回None(不是空字符串)
           match方法是从左到右匹配(因为match的这种特性,所以 ^ 从字符串头开始匹配 可以不用写),匹配到不一样的地方,match方法就结束!
    
    """
    """
    .   :匹配任意一个字符,
    除外
    []  :匹配[]中列举的字符
    d  : 数字,即0~9
    D  : 非数字
    s  : 空白字符,包括空格, 
     , 	 ,
    , 回车换行
    S  :非空白字符
    w  :单词,(可以看成是校验python变量名,实际两者没有任何关系,a~z , A~Z, 0~9 , _ )
    W  : 非单词字符
    """
    In [1]: import re
    
    In [2]: re.match('admin','good.admin')
    
    In [3]: re.match('.+','good.admin')
    Out[3]: <re.Match object; span=(0, 10), match='good.admin'>
    
    In [4]: re.match('.','good.admin')
    Out[4]: <re.Match object; span=(0, 1), match='g'>
    
    In [5]: re.match('..','good.admin')
    Out[5]: <re.Match object; span=(0, 2), match='go'>
    
    In [6]: re.match('.*','good.admin')
    Out[6]: <re.Match object; span=(0, 10), match='good.admin'>
    In [7]: re.match('w','good')
    Out[7]: <re.Match object; span=(0, 1), match='g'>
    
    In [8]: re.match('w','g1')
    Out[8]: <re.Match object; span=(0, 1), match='g'>
    
    In [9]: re.match('W','g1')
    
    # w与g匹配,但是W与1不相匹配,所以最终还是不匹配,返回None In [
    10]: re.match('wW','g1')
    """
    
    边界问题
    
    ^ : 匹配字符串开头
    $ : 匹配结尾
     : 匹配单词边界
    B : 匹配非单词边界
    
    """
    """
    
    匹配数量:
    
        *   : 匹配一个字符出现0次或者无限多次
        +   :匹配一个字符出现1次或者无限多次
        ?  :匹配一个字符出现0次或者1次
        {m} : 匹配一个字符出现m次
        {m,}: 匹配一个字符至少出现m次
        {m,n} : 匹配一个字符出现m到n次
    
    
    """
    """
    
    边界问题
    
    ^ : 匹配字符串开头
    $ : 匹配结尾
     : 匹配单词边界
    B : 匹配非单词边界
    
    """
    '''
    示例2:匹配手机号
    '''
    
    r = re.match('1[35689]d{9}$','13218545678')
    print(r)  # <re.Match object; span=(0, 11), match='13218545678'>
    
    r = re.match('1[35689]d{9}$','132185456789')
    print(r)  #None
    
    r = re.match('1[35689]d{9}','132185456789')  # 没有$符,无边界问题
    print(r)  #<re.Match object; span=(0, 11), match='13218545678'>
    
    r = re.match('1[35689]d{9}','13218545aaaa6789')
    print(r)  #None
    '''
    示例3: 匹配单词边界
    
    '''
    
    # r:去掉转义;  ^:字符串开头, od:od是单词边界
    r = re.match(r'^w+od','good')
    print(r) # <re.Match object; span=(0, 4), match='good'>
    
    r = re.match(r'^w+od','gooder')
    print(r) #None
    
    r = re.match(r'^w+od','good')
    print(r) #None
    
    r = re.match(r'^w+od','jd od')
    print(r) #None, 因为只表示单词边界,并不表示空格
    
    r = re.match(r'^w+sod','jd od')  # 这里用s去匹配了jd与od之间的空白字符
    print(r) #<re.Match object; span=(0, 5), match='jd od'>
    
    
    r = re.match(r'^w+odB','gooder')
    print(r) #<re.Match object; span=(0, 4), match='good'>
    
    r = re.match(r'^w+odB','good')
    print(r) #None
    """
    分组:
    
    
    |      : 表示左右任意一个表达式
    (ab)   :  将括号中的字符作为一个分组
    
    um   : 引用分组num匹配到的字符串
    (?P<name>) : 分组起别名
    (?P=name)  : 引用别名为name分组匹配到的字符串
    
    """
    '''示例4 匹配0-100之间的数字'''
    
    r = re.match(r'[1-9]d?$|0$|100$','100' )
    print(r) #<re.Match object; span=(0, 3), match='100'>
    
    # 改进版
    r = re.match(r'[1-9]?d?$|100$','0' )
    print(r) #<re.Match object; span=(0, 1), match='0'>
    '''
    示例5: 从字符串中抽取特定的字符 , 如抽取h1标签之间的字符
    '''
    
    s = '<h1>我是中国人</h1>'
    
    r = re.match(r"<h1>(.*)</h1>",s)
    print(r.group())  #<h1>我是中国人</h1>
    print(r.group(1))  # 我是中国人    , 1 : 表过正则表达式分组第1次出现
    
    s = '<h1>打倒小日本</h1>'
    r = re.match(r"<h1>(.*)</h1>",s)
    print(r.group())  #<h1>打倒小日本</h1>
    print(r.group(1))  # 打倒小日本    , 1 : 表过正则表达式分组第1次出现
    
    s = '<h1>打倒小日本 我是中国人</h1>'
    r = re.match(r"<h1>(D*)s(D*)</h1>",s)
    print(r.group())  #<h1>打倒小日本 我是中国人</h1>
    print(r.group(1))  # 打倒小日本  取第1个分组的值
    print(r.group(2))  # 我是中国人  取第2个分组的值
    print(r.groups())  # 将所有的分组结果以一个元组的形式打印出来
    '''
    示例6: 匹配<html><h1>zhengqinfeng</h1></html>,且,首尾尖括号中的内容相同、内层尖括号中的内容相同
    '''
    
    s = '<html><h1>zhengqinfeng</h1></html>'
    
    r = re.match(r'<.+><.+>.+</.+></.+>',s)
    print(r)  #<re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'>
    
    # 上面的正则貌似完成了需要,实则不然, 它并不满足"且"后面的要求,所以正确的正则如下
    
    r= re.match(r'<(.+)><(.+)>.+</2></1>',s)  # 正则前面加r,不会进行字符串转义
    print(r) #<re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'>
    
    s = '<html><h1>zhengqinfeng</h2></html>'
    r= re.match(r'<(.+)><(.+)>.+</2></1>',s)  # 正则前面加r,不会进行字符串转义
    print(r) #None
    
    """
        使用()时,re会记录()中的内容,我们可以使用
    um来引用
        在上面的示例中, 第一次出现的(.+) re会记录为num =1 ; 第二次出现的 (.+) re会记录为num =2
        在后面使用时,可以直接1, 2来引用值
    
    """

    由例5,例6两示例可知,正则分组用途如下:


    1. 从字符串提取出特定的字符

    2. 动态引用分组内容进行匹配
    '''
    示例7: 抽取邮箱账号
    
            (163|126|135|qq|gmail)  :表示匹配其中一种
            .  : 匹配邮箱中的.
            (com|cn|net) : 表示匹配邮箱后缀中的一种
            $ : 表结束 ,也就是说邮箱是以com,cn,或者是net结尾
    
    '''
    
    p = r'(w+)@(163|126|135|qq|gmail).(com|cn|net)$'
    
    r = re.match(p, '132@163.com')
    print(r)
    print(r.groups())
    print(r.group(1))  # 提取邮箱账号  132
    '''
    示例8: 正则分组取名字
    
    '''
    
    s = '<html><h1>zhengqinfeng</h1></html>'
    r =  re.match('<(?P<key1>.+)><(?P<key2>.+)>.+</(?P=key2)></(?P=key1)>',s)
    print(r)  # <re.Match object; span=(0, 34), match='<html><h1>zhengqinfeng</h1></html>'>
    print(r.groups())  # ('html', 'h1')
  • 相关阅读:
    简单的C语言编译器--语法分析器
    简单的C语言编译器--词法分析器
    简单的C语言编译器--概述
    最短路径算法
    拓扑排序和关键路径
    图的连通性
    最小生成树
    图的搜索
    gcc O2优化选项对内嵌汇编以及函数递归调用的影响
    gcc 在c代码中内嵌汇编调用c函数: 只是证明曾经我来过
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/11999963.html
Copyright © 2020-2023  润新知