正则表达式

正则表达式

处理字符串的利器

  • 选用:
    1. 想查看原字符串是否匹配 ->match,fullmatch,search
    2. 想从大字符串中提取指定的子字符串 ——> findall,finditer
      1. 格式:函数(正则表达式,字符串)
      2. 核心:正则表达式整体就是一个具有某一特定规则的字符串,主要是要将想要拿的数据的特定规则写出来
    3. 切割和替换:split,sub

一、匹配

匹配核心规则:判断后面的字符,是否符合正则表达式描述的规则,符合返回:匹配的字符,不符合返回:None

1. 正则表达式语法

1. 匹配类符号

以下都是针对一个字符的格式判断

  1. 普通符号: – 在正则表达式中表示本身的符号
    • str1 = ‘abc’
    • result = fullmatch(r’abc’,str1)
    • 除了特殊符号,就是普通字符
  2. . : – 表示匹配任意一个字符
    • result = fullmatch(r’a.c’,str1)
    • 任意字符,注重要求长度或占位情况
  3. \d : – 匹配任意一个数字字符
    • result = fullmatch(r’a\dc’,‘123’)
  4. \s : – 匹配任意一个空白字符:例如:空格、换行、水平制表符
  5. \D : – 匹配任意一个非数字字符
  6. \S : – 匹配任意一个非空白字符
  7. \w : – 匹配字母数字下划线,等价于[a-zA-Z0-9_]
  8. \W : – 匹配非数字字母下划线的字符
  9. [字符集]: – 匹配字符集中的任意一个字符(最常用)
    • 规范:可以连在一起写,合并为一个区间,判断该一个字符在不在这个区间
    1. 写多个其中一个,eg:[abc],字符集中不用写引号
    2. 有特殊字符,eg:[abc\d],匹配任意一个数字或者a/b/c
    3. 区间,小的放前面,大小按照编码值来确定eg:[1-9],[3-9],[a-z],[A-Z],[\u4e00-\u9fa5],[1-9abcA-Z],[1-9a-zA-Z]
      • 如果减号两边没有字符,那就是普通字符‘-’
      • '-'号只有在[]里的,且在两个字符中间的时候,有特殊功能表示区间
  10. [^字符集]: – 不在字符集中的任意一个字符
    • result = fullmatch(r’a[^\u4e00-\u9fa5]b’,‘asb’)

2. 匹配次数符号:

统一格式为:匹配符号匹配次数符号.跟在谁后面,就是控制谁

    • :0次或多次,任意次数。eg:result = fullmatch(r’a*bc’,‘aaaaabc’)
    • :1次或者多次,至少一次。
  1. ? :1次或0次。
  2. {} : – 最常用
    1. {M,N} - M到N次
    2. {M,} - 至少M次
    3. {,N} - 最多N次
    4. {N} - 就是N次

3. 贪婪和非贪婪 - 当匹配次数不确定时(*、+、?、{M,N},{M,}、{,N}),匹配模式分为贪婪模式和非贪婪模式两种,默认是贪婪的。

  1. 贪婪:如果匹配成功的时候,有多种匹配结果,贪婪取最多次数对应的匹配结果
    • *、+、?、{M,N},{M,}、{,N}
  2. 非贪婪:如果匹配成功的时候,有多种匹配结果,贪婪取最多次数对应的匹配结果
    • 正常匹配次数后面加一个‘?’
    • *?、+?、??、{M,N}?、{M,}?、{,N}?
  3. 注意:
    1. 要求:必须有多种匹配返回的结果
    2. 举例:fullmatch只有一个结果(原字符串/空),无贪婪情况。match是从原字符串中截取开头,返回开头字符串,可能会有多种开头字符的情况

4.分组和分支

  1. 分组 - ()、捕获是针对于()来说的

    • 分组功能:
      1. 表达式重复:将正则中的一部分看成一个整体,进行相关操作。
        • ‘12MN23MN34KJ…’
        • result = fullmatch(r’(\d\d[A-Z]{2})+',str1)
        • 对一个括号整体结构,进行匹配次数操作
      2. 要求某块字符和之前的部分字符的一样:可以在正则表达式中通过\N(\任意正整数)来重复它前面第N个分组的匹配结果(从左边开始数)
        • str2 = ‘23MKJ==MKJ23’
        • result = fullmatch(r’(\d{2})([A-Z]{3})==\2\1’,str2)
        • 只能重复在它之前的分组,不能重复之后的
      3. 捕获: 只获取正则表达式中的分组匹配到的结果
        1. 手动捕获:()里输入组数
        2. 自动捕获: 当findall正则表达式中加入(),先匹配出结果,然后返回匹配结果()中的内容
  2. 分支 - |

    1. 语法:正则1|正则2|正则3|…
    2. 功能: 匹配可以和多个正则中任意一个正则匹配的字符串
    3. 理解:
      1. |分开的是两个正则
      2. ()中加|,是对组内分支。所以如果只想要一部分变化,那就用(部分正则1|部分正则2)
    4. 举例:result=fullmatch(r’\d{3}|[a-z]{2}',‘mk’) -->

5.转义字符

  1. 正则表达式中有许多有特殊含义的字符,当需要让其表示本身时,前面加一个\进行转义即可
  2. 正则表达式前面的r是为了让正则规则生效,不是原始字符串
  3. 单独存在,有特殊意义的符号,在[]中特殊意义会自动失效

6. 检测类符号 – 在匹配成功的情况下,检测检测符号所在的位置是否符合要求

  1. \b:检测是否是单词边界
    • 单词边界:可以将两个单词分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头、字符串结尾
    • 不影响原正则,只是在其上对成功返回的匹配结果,进行进一步筛选。\b
  2. \B:
  3. ^ :检测是否是字符串开头
    • 预防贪婪,只取前面多少个
    • findall(r’^.{10}')
  4. $ :检测是否以字符串结尾
    • 预防贪婪,只取前面多少个
    • findall(r’.{5}$')

2. 功能函数

  • python中的re模块: - python用来支持正则表达式的模块,包含了所有和正则相关的函数方法
  • from re import * (想用哪个自己加)
    1. fullmatch(正则表达式,字符串) – 完全匹配;全部字符,挨个对照格式,返回是否匹配

      • 功能: 判断正则表达式和指定的一个字符串是否完全匹配
      • 返回值:匹配成功,返回匹配对象,匹配失败,为None
    2. match(正则表达式,字符串)

      • 功能:判断字符串开头,的若干个字符是否符合正则表达式描述的规则。
      • 返回值:匹配成功,返回匹配对象(开头子串),匹配失败,为None
    3. search(正则表达式,字符串)

      • 功能:获取字符串中第一个满足正则的子串
      • 返回值:找的到,返回该子串;找不到返回None
    4. findall(正则表达式,字符串)

      • 功能:返回列表,所有满足正则的子串,加进列表里
      • 返回值:成功,返回一个列表,列表中包含所有满足条件的子串,找不到返回空列表
      • 特殊:会有自动捕获:一旦正则中出现(),就只输出()中的内容
    5. finditer(正则表达式,字符串)

      • 功能:同findall
      • 返回值:成功,返回一个迭代器,迭代器中包含所有符合条件的子串,找不到
    6. split(正则表达式,字符串)

      • 功能:将字符串中所有满足条件的子串作为切割点
      • 返回值:成功返回切割后的列表,失败,就是列表中只有一个元素
      • 举例:
        • str1 = ‘cdscsuibcacdscsdcc’
        • result = split(r’a|d’,str1)
    7. sub(正则表达式,字符串1,字符串2)

      • 功能:将字符串2中所有满足正则的子串都替换成字符串1

3.匹配对象

  • 拿到匹配对象后能干什么:
    1. 获取整个正则表达式对应的匹配结果(match=):result.group()
    2. 手动捕获某个分组对应的匹配结果:result.group(分组数)
    3. 获取匹配结果在原字符串中的位置:result.span(分组数) 分组数可以不写,不写是大的 ,有分组,就发生捕获。都会返回一个元组,(开始下标,结束下标)

4. 参数

  1. 正则匹配忽略大小写
    • 写法“fullmatch(r’(?i)abc’,aBc) 引号里开头写入(?i)
  2. 单行匹配 :
    • 多行匹配:匹配时,.不能和换行(\n)进行匹配,需要先将其转化为单行匹配
    • 方法:引号里的开头加上(?s)
from re import match
var = 'abcd'
result = match(r'ab',var)
print(result)

from re import match
str2 = '23MKJ==MKJ23'
result = fullmatch(r'(\d{2})([A-Z]{3})==\2\1',str2)
print(result)


你可能感兴趣的:(正则表达式,python)