python3正则表达式学习

  1. python3正则表达式学习

    正则表达式是一个特殊的字符序列,它能帮助你方便检查一个字符串是否与某种模式匹配。python提供re模块使python语言拥有全部正则表达式功能。

    compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

  2. 正则表达式基础

    • 子模式

      1
      2
      3
      4
      \w: 匹配任意字母、数字、或者_
      \d: 匹配数字(十进制)
      \s: 匹配空白符号(空格、tab等)
      . : 匹配任意字符(换行符除外)
    • 重复子模式

      1
      2
      3
      \d* : 表示任意数字,包括0个,*匹配0次或者多次
      \w+ : 表示匹配至少一个字母、数字、或者_
      \w{3:6} :表示匹配3-6之间的字母、数字、或者_
    • “或”运算 - |

      (p|P)ython :可以匹配Python也可以匹配python

    • 选择符:?

    • 1
      (https://)?(www.)?(lsowl.xyz) :可以匹配到:https://www.lsowl.xyz  https://lsowl.xyz www.lsowl.xyz  lsowl.xyz 四个,也就是字符串必须在最后一个元组才可以被匹配到

      字符集:[]

      1
      2
      [a-zA-Z0-9_] : 等价于\w
      [0-9a-zA-Z\.\_] : 匹配数字、字母、.和_
    • 开始符和结尾符:^ , $

      1
      2
      3
      ^\d : 以数字开始
      \w$ : 以字母结尾
      ^[a-zA-Z][0-9a-zA-Z\_]* :匹配python的合法变量
    • 分组: ()

      • 捕获组

        (^[0-9a-zA-Z]\w{5,17})@[0-9a-zA-Z]+\.\w+ : 匹配邮箱用户名

      • 非捕获组

        1
        2
        3
        (^[0-9a-zA-Z]\w{5,17})@[0-9a-zA-Z]+\.(?:net|com|top|cn) :捕获指定后缀名的邮箱用户名

        (?:\d+\.){3}\d+ : 匹配IP
    • 正则表达式使用的特殊符号和字符

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      literal 匹配字符串的值
      re1|re2 匹配正则表达式re1或re2
      . 匹配任意字符(换行符除外)
      ^ 匹配字符串的开始
      $ 匹配字符串的结尾
      * 匹配前面出现的正则表达式零次或多次
      + 匹配前面出现的正则表达式一次或多次
      ?匹配前面出现的正则表达式零次或一次
      {N} 匹配前面出现的正则表达式N次
      {M,N} 匹配重复出现M次到N次的正则表达式
      […] 匹配字符组里出现的任意一个字符
      […x-y…] 匹配从字符x到y中的任意一个字符
      [^…] 不匹配此字符集中出现的任意一个字符
      (*|+|?|{})? 用于上面出现的任何“非贪婪”。版本重复匹配次数符号。如.*?a表示匹配到第一个a出现取前面任意长度的字符。
      (…) 匹配封闭括号中正则表达式(RE),并保存为子组
      \d 匹配任何数字,和[0-9]一样(\D是\d的反义:任何非数字)
      \w 匹配任何数字字母字符,和[A-Za-z0-9_]相同(\W是\w的反义)
      \s 匹配任何空白符,和[\n\t\r\v\f]相同(\S是\s的反义)
      \b 匹配单词边界(\B是\b的反义)
      \nn 匹配已保存的子组(参考(…))如price:\16
      \c 逐一匹配特殊字符c(即,取消它的特殊含义,按字面匹配)
      \A(\Z)匹配字符串的起始(结束)
    • 一些说明

      (1)用管道符号(|)匹配多个正则表达式
      (2)匹配除换行符外任意一个单个的字符(.)
      (3)从字符串的开头或结尾或单词边界开始匹配(^ $或\A \Z \b \B)
      (4)创建字符类([])
      (5)指定范围(-)和否定(^)
      (6)使用闭包操作符(* + ? {})实现多次出现/重复匹配
      (7)?的两种含义:

      • 表示匹配出现0或1次;

      • 紧跟在表示重复的元字符后面时(如+?),表示要求搜索引擎匹配的字符串越短越好。(*+?{m,n})尽量“吸收”更多的字符,这叫“贪心”。

      (7)特殊字符表示、字符集

      • \d表示十进制数字(\D表示非十进制数字)
      • \w表示整个字符数字的字符集(\W)
      • \s表示空白字符(\S)

      (8)用圆括号(())组建组 、()的功能:对正则表达式进行分组;匹配子组。

      • 对正则表达式进行分组可以实现用不同的正则表达式去匹配字符串,或重复整个正则表达式多次。
      • 使用子组匹配是为了能够提取匹配模式的内容,Python的re支持此功能。
  3. python的re模块

    • re模块的用法

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      import re
      str = "xxxflag{sss}sss"

      # #用法1:
      re_flag = re.compile(r'flag{\w+?}')
      flag = re_flag.findall(str)
      print(flag)

      #用法2:
      flag =re.findall(r'flag{\w+?}',str)
      print(flag)
    • 贪心匹配和非贪心匹配

      • 贪心匹配:正则表达尽可能多的匹配元素
      • 非贪心匹配:正则表达式尽可能少的匹配元素
    • match和search的区别

      • match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,返回None
      • search匹配整个字符串,直到找到一个匹配
    • 分组匹配(优点在说明第(8)点)

  4. python中常用的正则表达式处理函数

    • re.match() 尝试从字符串的起始位置匹配一个模式,如果不是起始位置就匹配成功,match返回none
      • 函数语法 re.match(partten,string,flags=0)
      • 函数参数说明
      • 使用group(num)或groups()匹配对象函数来获取匹配表达式
    • re.search() 扫描整个字符串并返回第一个成功的匹配
      • 函数语法 re.search(pattern,string,flags=0)
      • 使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
    • re.sub()用于替换字符串中的匹配项
      • 函数语法 re.sub(pattern,repl,string,count=0)
      • 函数参数说明
      • 使用实例(包含是否使用repl参数的,repl可能是个函数)
    • re.compile() 用于编译正则表达式,生成一个正则表达式对象供match和search两个函数使用
      • 函数语法 re.compile(pattern[, flags])
      • 参数说明
      • 使用实例(当匹配成功的时候返回一个match对象)
    • re.findall() 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回一个空列表
      • 函数语法 findall(string[, pos[, endpos]])
      • 函数参数
      • 使用实例(用compile函数生成正则表达式对象)
    • re.finditer() 和findall类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
      • 函数语法 re.finditer(pattern, string, flags=0)
      • 函数参数
      • 使用实例(用for循环迭代输出)
    • re.split() split 方法按照能够匹配的子串将字符串分割后返回列表
      • 函数语法 re.split(pattern, string[, maxsplit=0, flags=0])
      • 函数参数
      • 使用实例(对于一个找不到匹配的字符串,split不会分割)
  5. 正则表达式对象

    • re.RegexObject (re.compile() 返回的就是一个正则表达式对象)

    • group()返回被RE匹配的字符串

    • start() 返回开始匹配的位置

    • end() 返回匹配结束的位置

    • span()返回一个元组包含(开始,结束)的位置