• 正则表达式:(re库)


    import re
    
    正则表达式是如何进行比对的?
    1.遍历目标字符串
    2.依次取出单个字符与表达式中的第一个规则字符进行匹配
        如果一致,则遍历下一个字符与规则字符串中的第二个进行匹配,重复如此操作;如果都匹配上了则从目标字符串中取出该结果,放置到列表;
        接着从上一个匹配成功的位置作为起始点继续往下找(注意:不会往前找了),如果找到则再次添加到列表;
    3. 例如:
        print(re.findall('str','8string str'))
        >> ['str', 'str']
    实际考核是否理解: 
        print(re.findall('a.b','abb a\nb abb'))
                                    a.b   # .号不能匹配换行符,匹配失败;则下一次应该是a与\n开始比对,因为最开始是与a作为起始比对,没有对上
                                      a.b
    """
    
    """正则表达式匹配单个字符
    1. 匹配单个字符
    \w: 匹配字母数字下划线
        print(re.findall('str','8string str'))
        >> ['s', 't', 'r', 'i', 'n', 'g', 's', 't', 'r', '_', '3']  # 可以看到,没有匹配空格
        
    \W: 取反,匹配非字符数字下划线
        print(re.findall(r'\W','${get'))
        >> ['$', '{']
        
    \s: 匹配任意空白字符,等价于[\t\n\r\f],以及空格;ps:\r是回车,\f是换页;\s就是拿\n\t等这些空白的字符去一个个匹配;
        print(re.findall(r'\s','\nstring name\t\r\f'))
        >> ['\n', ' ', '\t', '\r', '\x0c']  # ps:如果字符串变成原始字符串,不会匹配到,如r'\nstring name\t\r\f'
        
    \S: 取反,匹配非空白字符
        print(re.findall(r'\S','${g e t\n'))
        >> ['$', '{', 'g', 'e', 't'] 
        
    \d: 匹配任意数字,相当于[0-9]
        print(re.findall(r'\d','${get(age=6,name="7")}'))
        >> ['6', '7']
        
    \D: 取反,匹配非数字
        print(re.findall(r'\D', 'abcdef1234'))
        >> ['a', 'b', 'c', 'd', 'e', 'f']
        
    -------------------------------------------------------------------------
    \A: 只匹配开头的字符串,中间如果也有符合条件的,不会去匹配,匹配不到就是空列表
        print(re.findall(r'\A李白', '李白是李白'))
        >> ['李白']
        
    \Z:只匹配结尾符合条件的字符串,中间如果也有符合条件的,不会去匹配,,匹配不到就是空列表
        print(re.findall(r'\A是', '是李白是'))
        >> ['是']
        注意:如果字符有过换行,是匹配不到的,只有字符串是一行的情况下才能匹配到
        print(re.findall(r'\A是', \"""
        是李白是
        \"""))
        
    上面这种方式了解即可,我们实际上匹配时用的是^$;$就可解决上面的问题;
    ^: 匹配开头
    $: 匹配结尾
        联用
        print(re.findall(r'^ales$','ales')) # 注意^别放到了字符串的后面a^
        >> ['ales']
        print(re.findall(r'^ales$','al  es'))
        >> []
    -------------------------------------------------------------------------
    
    . 匹配任意字符,除了换行符;如果想匹配换行符,需要加上参数re.DOTALL;例如:re.findall('a.b','abb a\nb abb',re.DOTALL)
      re.S是re.DOTALL的简写,也可以用这个;参考链接:https://www.pynote.net/archives/1202
      
    * 不可单独使用;表示左侧字符串匹配0次或无穷次;性格贪婪
        print(re.findall(r'ab*', 'a ab abb abbbbb bbbbb'))
        >> ['a', 'ab', 'abb', 'abbbbb']
        
        解析:ab*
        首先*号的意思:0次或无穷次的意思指的是;*号左侧的【第一个字符】可以是0个,但是如果有,我就将所有连续的b字符都匹配到
        
    + 不可单独使用;表示左侧字符匹配一次或无穷次;性格贪婪
        print(re.findall(r'ab+', 'a ab abb abbbbb bbbbb'))
        >> ['ab', 'abb', 'abbbbb'] ps:这里的a就匹配不到了
        
        解析:和*的区别就在于,左侧至少要有一个,最多不限
        
    ? 不可单独使用;表示左侧字符匹配0次或1次 
        print(re.findall(r'ab?', 'a ab abb abbbbb bbbbb'))
        >> ['a', 'ab', 'ab', 'ab']
        
    -------------------------------------------------------------------------
    上面的到目前为止都不能自己去指定左侧字符出现的次数,下面就是讲解自定义
    {m}: 左侧匹配m次,和{m,n}相比,是一个精确的
    {m,n}: 左侧重复m次或n次;
            可以替换上面的
                       {0,1}==>?
                       {1,}==>+
                       {0,}==>*
            print(re.findall(r'ab{2,5}', 'a ab abb abbbbb bbbbb'))
            >> ['abb', 'abbbbb']
    
    综合运用:找出字符中的所有整数和小数
        print(re.findall(r'\d+\.?\d*', '"asdfasdf123as1.13dfa12adsf1asdf3")'))
        >> ['123', '1.13', '12', '1', '3']
        分析:1. 首先必须是数字,使用\d匹配,数字至少要有一个或无穷个,用+
             2. 小数点,这里需要转移,不然会当成匹配符;整数没有小数点,但是小数有;因此小数点可以没有,但是有就只能有一个,用?
             3. 小数点后面,必须是数字且数字在整数的情况下数量为0,在小数的情况下可以有无限个,用*
             
    -------------------------------------------------------------------------
    上面说到的.可以匹配任意的字符,但是我们如果指向匹配指定的数字就无从下手,下面就是讲解自定义
    [] : 匹配[]中的任意一个指定字符;[]内部的都会当成普通字符,但是也存在着一些特殊字符,下面展开介绍
        print(re.findall('a[501234]b', 'a1b a*b a-b'))
        >> ['a1b']
        
       []中为了方便,也存在着特殊字符以供调用
       特殊字符:- 连续的意思
                匹配0-9的数字可以写成[0-9],不可写成[9-0]
                匹配小写字母可以写成[a-z],不可写成[z-a]
                匹配大写字母可以写成[A-Z],不可写成[Z-A]
                上面的可以结合起来用[0-9a-zA-Z],一组的顺序可以随意写,例[a-za-9A-Z]
                注意:
                    如果匹配的字符中-要当成普通字符去匹配,应该放到[]的开头或结尾,否则会被当成特殊字符
                    上面的a-z这种范围型的不一定只能写a-z,a-cdefg...都行,只是普遍用a-z匹配全部小写
                
                print(re.findall('a[1*-]b', 'a1b a*b a-b'))
                >> ['a1b', 'a*b', 'a-b']
    
       特殊字符:^ 取反的意思
                print(re.findall('a[^1]b', 'a1b a*b a-b')) 
                >> ['a*b', 'a-b']
                
                print(re.findall('a[^0-9]b', 'a1b a*b a-b')) 
                >> ['a*b', 'a-b']
                
                注意:在[]外面,^代表的是匹配开头的单个字符
    
    | : 匹配多个表达式中的任意一个;a|b表示满足条件中的任何一个即可匹配到
    (): 分组;如果想将一个字符串分组取出,则使用()匹配;
        print(re.findall('(\d+)-(\d+)', '333-444'))
        >> [('333', '444')]
        分成了两组:这时候不同方法取组的方法不同,findall会将多个组放到一个元祖中;ps:外面的列表是findall默认的结果容器
        match,search等方法暂时不用
        
    \b: 字符边界匹配
    
    \:为什么要用r
    print(re.findall('a\\c','a\c')) #对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
    print(re.findall(r'a\\c','a\c')) #r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义
    print(re.findall('a\\\\c','a\c')) #同上面的意思一样,和上面的结果一样都是['a\\c']
    
    
    re 模块的一般使用步骤如下:
    使用 compile 函数将正则表达式的字符串形式编译为一个 Pattern 对象
    通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(一个 Match 对象)
    这样的好处是,如果多个地方用到了同一个正则表达式,一旦正则需要发生改变,只需要更改一处即可;
    
    
    

    本文来自博客园,作者:中州韵,转载请注明原文链接:https://www.cnblogs.com/zhongzhouyun/p/14967670.html

  • 相关阅读:
    thrift 依赖的库
    环球雅思名师公益大讲堂课表2.182.23 雅思资讯 环球雅思
    经验分享band 7.5已经工作的人如何准备雅思考试学习心得雅思频道|太傻网考试频道|常识 辅导 技巧 机经 名师 访谈 交流 资料 试题库
    Chapter 14. Boost.PropertyTree
    少讨论概念,少争论特征、少议论模型;多写代码、多做测试、多做应用。
    澳洲技术移民申请流程
    neo4j——图数据库初探 JDream314的专栏 博客频道 CSDN.NET
    Australia Immigration Network
    boost::property_tree
    海外澳洲技术移民花费一览表(2006年11月完整版) Topboy 博客园
  • 原文地址:https://www.cnblogs.com/zhongzhouyun/p/14967670.html
Copyright © 2020-2023  润新知