zoukankan      html  css  js  c++  java
  • Python函数篇(7)-正则表达式

    1.正则表达式

      正则表达式为高级的文本模式匹配,抽取,与/或文本形式的搜索和替换功能提供了基础,简单的来说,正则表达式是由一些字符和特殊符号组成的字符串。Python通过标准库中的re模块来支持正则表达式。

    2.特殊符号和字符

      首先介绍一下最常见的特殊符号和字符,即所谓的元字符。

    表示法 描述 正则表达式用法示例
    literal 匹配文本字符串的字面值literal re.findall("chen","sadchen21")
    . 匹配任意字符(除了 之外) re.findall("c..n","sadchen21")
    ^ 从字符串开始部分开始匹配 re.findall("^sad","sadchen21")
    $ 匹配字符串的终止部分 re.findall("21$","sadddchen21")
    * 匹配0次或多次前面出现的正则表达式 re.findall("sad*","saddddchen21")
    + 匹配1次或多次前面出现的正则表达式 re.findall("sad+","sadddchen21")
    匹配0次或者1次前面出现的正则表达式 re.findall("sad?","sadddchen21")
    {N} 匹配N次前面出现的正则表达式 re.findall("sad{3}","sadddchen21")
    {M,N} 匹配M~N次前面出现的正则表达式 re.findall("sad{1,3}","sadddcen21")
    [] 匹配来自字符集的任一单一字符 re.findall("[a-z]","sadddcen21")
    [^..] 不匹配此字符集中出现的任一字符,包括某一范围的字符 re.findall("[^a-z]","sadddcen21")
    (...) 匹配封闭的正则表达式,然后另存为子组 re.findall("[(a-z)]","sadddcen21")
    d 匹配任何的十进制数,与[0-9]一致(/D与/d相反,不匹配任何非数值型的数字) re.findall("d","sa2dcen21")
    w 匹配任何字母数字字符,与[A-Z],[a-z],[0-9]相同,(W与之相反) re.findall("w","sa2dcen21")
    s 匹配任何空格字符,与 等相同,(与S相反) re.findall("s","sa2dce n 21")
     匹配任何单词边界,匹配特殊字符(B与之相反) re.findall(r"I","I am Czp")

      在上面/b的例子中,为什么要加r?
      r的作用就是让后面的字符串不做任何的转义,如果不加r能不能起到相同的作用呢?

    re.findall("I\b","I am Czp")   通过转义符来实现
    

    3.重要符号详细用法讲解

    • 表示择一的管道符号“|”,表示一个“从多个模式中选择其一”的操作,它用于分割不同的正则表达式,择一匹配有时候也被称为(union)或逻辑或
    re.findall("ka|b","sdkakb11")     匹配ka或b
    re.findall("ka|b","sdka11")    
    
    • 匹配任意字符“.”,点好或句点(.)符号匹配除了换行符 以外的任意字符
    re.findall("s..a","sdka11")  匹配在s和a之间任意的两个字符
    re.findall("..","sdka11")    匹配任意两个字符
    re.findall(".a","sdka112")   匹配a前的任意一个字符
    

      要显式匹配一个句点符号本身,必须使用反斜杠转义句点符号的功能,例如“.”

    • 从字符串起始或者结尾或者单词边界匹配“^”“$”“”
    re.findall("^sa","sdka112")  匹配以s开头的字符或字符串
    re.findall("12$","sdka112")  匹配以12结尾的字符或字符串
    

      匹配边界字符“”
      用于匹配一个单词的边界,这意味着如果一个模式必须位于单词的起始部分,就不管该单词前面(单词位于字符串中间)是否有任何字符(单词位于首行),而B将匹配出现在一个单词中间的模式,即不是单词边界

    re.findall("er","never")        匹配任意包含the的字符串
    re.findall(r"er","never")     匹配任意以er为起始位置的字符串
    re.findall(r"erB","evern")     匹配包含er但不以er为起始的字符串
    

      创建字符集“[]”
      “.”可以用于匹配任意符号,但某些时候需要匹配某些特定字符,这就需要[],用来匹配一对方括号中包含的任何字符。如b[ner]t匹配的字符串就是bnt,bet,brt,方括号表示逻辑或的功能,对于单个字符,如果想要:要么匹配a,要么匹配b,就可以用[ab]表示,字符集只适用于单字符的情况,如果要匹配多个字符,就需要使用择一方法“|”
      最常用的特殊符号“”“+”“?”
      "
    "、"?"、"+"都可以用来匹配一个、多个或者没有出现的字符串模式,"*”用来匹配其左边的正则表达式出现零次或多次,“+”号将匹配一次或多次出现的情况,“?”将匹配零次或一次出现的正则表达式,而{N}或{M,N}这将最终精确的匹配前面的正则表达式N次或一定范围的次数。
      当模式匹配使用分组操作符的时候,正则表达式的引擎将试图匹配出尽可能多的字符,这叫做贪婪匹配

    re.findall("sad*","saddddsds")  匹配d,d可以出现0次,或多次
    re.findall("sad+","saddddsds")  匹配d,d不可以出现0次,匹配1次或多次
    re.findall("sad?","saddddsds")  匹配d,d可以出现0次,匹配0次或1次
    re.findall("d{2}","sad123dsds") 匹配两个连续的数字字符
    

      如果想要提取任意已经成功匹配的特定字符串或子字符串,就需要用“()”来包裹正则表达式
      当使用正则表达式的时候,一对圆括号可以实现以下任意一个功能

    • 对正则表达式进行分组
    • 匹配子组

      示例:当有两个不同的正则表达式而且想用它们来比较同一个字符串的时候,就需要用到“()”,还有对正则表达式进行分组可以重复使用操作符,使匹配到的子字符串保存起来以供后续使用。
      扩展表示法,以问号开始(?..),很重要的一个(?P)表述的是一个分组匹配,会常用到,关于扩展表示法,如果在后面的程序中遇到,我会讲解,感兴趣的自己下去百度~

    4.re模块的核心函数和方法

      常见的正则表达式属性
    compile() | 使用可选的标记来编译正则表达式的模式,返回一个对象
    match() | 匹配字符串,如果成功,就返回匹配对象,如果失败,就返回None
    search() | 匹配第一次出现的正则表达式,成功,返回匹配对象,失败,就返回None
    findall() | 查找字符串中所有出现的正则表达式模式,并返回一个匹配列表
    finditer() | 与findall相同,但返回的不是一个列表,而是一个迭代器
    spilt() | 将字符串分割为列表,返回成功匹配的列表
    sub() | 替换所有正则表达式的模式在字符串中出现的位置
    purge() | 清楚隐式编译的正则表达式模式
    group() | 返回整个匹配对象,或者编号为num的特定子组
      函数篇就写到这里,接下来会写面向对象部分的内容,如果有遗漏的,欢迎大家和我交流,我会第一时间补上遗漏的知识点。

  • 相关阅读:
    A+B Problem
    迭代平方根
    猴子报数
    分数求和
    猴子吃桃
    钻石
    杨辉三角形
    MYSQL 5.7 修改密码、登录问题
    SQL 语句 explain 分析
    重构CMDB,避免运维之耻
  • 原文地址:https://www.cnblogs.com/Chen-Zhipeng/p/8194096.html
Copyright © 2011-2022 走看看