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

    re(正则)模块

      1. 正则模块,在python中用来操作正则表达式的模块。用来校验字符串的合法性,爬虫等。

      2. 正则表达式,是一种用来匹配字符串内容的规则。(工具:regex)

      3. 元字符:一个字符所表示的内容

    # 常用
    .  匹配除了换行符以外的任意字符
    w 匹配字母数字或下划线
    s 匹配任意的空白符
    d 匹配数字
    a|b 匹配字符a或字符b
    ()匹配括号内的表达式,也表示一个组
    [...] 匹配字符组中的字符
    [^...]在字符集里表示匹配除了字符组中的所有字符
    # 比较常用
    
     匹配换行符
    ^ 匹配字符串的开始
    $ 匹配字符串的结尾
    # 不太常用
    	 制表符
     匹配单词的结尾
    W 匹配非字母数字或下划线
    D 匹配非数字
    S 匹配非空白符
    

       4. 量词:只表示前面一个字符的次数

    *  重复零次或更多次
    +  重复一次或更多次
    ? 重复零次或一次
    {n}  重复n次
    {n,}  重复n次或更多次
    {n,m}  重复n到m次
    

       5. 贪婪匹配: 字符+量词,每个量词只控制前面一个字符的出现次数,这个两次的匹配方式就是贪婪匹配(尽量多的匹配)

      6. 非贪婪匹配: 字符+量词+?,常用 .*? + 任意字符,匹配到任意字符就返回

      7. 分组:约束多个字符集匹配次数

      8. 转义符,在正则里想表示换行符 ,需要写\n,表示字符串" ",要写\\n。

        python中,r"正则表达式",取消python中的各种转义符,无需再次转义

      9. 回溯算法:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

        正则的贪婪匹配本质就是回溯算法。

      10. re模块的使用

    import re
    re.split("[ab]","afdbndf")---先按a去分割,再按b去分割
    
    import re
    re.sub("新的","旧的","需要替换的内容","次数")---替换
    
    import re
    ret = re.subn('d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次)
    print(ret)
    
    import re
    obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    print(ret.group())  #结果 : 123
    
    import re
    ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    print(ret)  # <callable_iterator object at 0x10195f940>
    print(next(ret).group())  #查看第一个结果
    print(next(ret).group())  #查看第二个结果
    print([i.group() for i in ret])  #查看剩余的左右结果
    

       11. re模块中的findall、search、compile方法

    import re
    ret = re.findall("正则表达式","要匹配的字符串")---直接返回一个列表,每个结果都是字符串,找不到返回空列表
    print(ret)
    
    ret2 =  re.search("正则表达式","要匹配的字符串")---匹配找到的第一个结果,找不到返回None
    if ret2:
        print(ret2.group())
    
    ret3 = re.match("正则表达式","要匹配的字符串")---只匹配从头开始匹配到的值,找不到返回None
    if ret3:
        print(ret3.group())
    

      小结:在调用的角度上看没有区别,接受两个参数按照位置传,正则表达式和要匹配的字符串

      返回值的区别:
         re.findall(): 返回列表,匹配到的所有内容都会出现在列表中,如果没有匹配到返回空列表
         re.search(): 如果匹配到结果返回第一个匹配到的,如果没有匹配到返回None,返回值用group()方法取出来
        re.match(): 只匹配从头开始匹配到的第一个值,如果没有匹配到返回None,返回值用group()方法取出来

      12. re.findall()优先级问题

        分组的优先匹配,优先显示,只显示分组里的内容

        在分组里加 ?: 就可以全部显示了

      13. re.split()优先级问题

        如果先分组再分割,分隔符也会保留并输出

      14. 分组

        分组命名:(?P<name>w+)

        分组赋值:(?P=name)  ?P<变量名>:只取到标签名

    import re
    ret = re.search("<w+>w+</w+>","<h1>hello</h1>")
    print(ret.group())
    
    
    ret = re.search("<(?P<name>w+)>w+</(?P=name)>","<h1>hello</h1>")
    print(ret.group())    # 全部取出来
    print(ret.group("name"))    # 只取标签名
    
    
    ret = re.search("<(?P<name>w+)>(?P<a>w+)</(?P=name)>","<h1>hello</h1>")
    print(ret.group())    # 全部取出来
    print(ret.group("name"))    # 只取标签名
    print(ret.group("a"))    # 取到内容
    

        分组的用途

          对多个字符进行整体的量词约束

          对于一条匹配的正则,只对其中我需要的内容进行分组

     

  • 相关阅读:
    《Linux内核分析》第七周学习总结
    《Linux内核分析》第六周学习总结
    《Linux内核设计与实现》第三章学习笔记
    《Linux内核分析》第五周学习总结
    《Linux内核设计与实现》第五章学习笔记
    《Linux内核分析》第四周学习总结
    Will We All Secretly Love Twitter’s Fleets?
    Medium高质量英语阅读(3):Startups Are Starting to Choose Normal Names Again
    Medium高质量英语阅读(2):Reimagining The Classroom Of The Future: A Conversation With Matt Wilkerson
    Medium高质量英语阅读(1):How Japanese People Stay Fit for Life, Without Ever Visiting a Gym
  • 原文地址:https://www.cnblogs.com/chitalu/p/12349794.html
Copyright © 2011-2022 走看看