正则表达式

  1. Python自1.5以后增加了re的模块,提供了正则表达式模式

    • re模块使Python语言拥有了全部的正则表达式功能

  2. re模块简介

    • 导入re模块

      • import re

    • re.match函数

      • 原型:re.match(pattern,string,flags = 0)

      • 参数:

        • patter 匹配的正则表达式

        • string 要匹配的字符串

        • flags:标志位,用于控制正则表达式的匹配方式

          • 值如下

            • re.I 忽略大小写

            • re.L 做本地户识别

            • re.M 多行匹配,影响^ 喝$

            • re.S 是. 匹配包括换行符在内的所有字符

            • re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B

            • re.X 使我们以更灵活的格式理解正则表达式

      • 功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置,匹配成功的话,返回None

    • re.search函数

      • 原型 re.search(patter,string,flags =0)

      • 参数

        • patter 匹配的正则表达式

        • string 要匹配的字符串

        • flags:标志位,用于控制正则表达式的匹配方式

          • 值如下

            • re.I 忽略大小写

            • re.L 做本地户识别

            • re.M 多行匹配,影响^ 喝$

            • re.S 是. 匹配包括换行符在内的所有字符

            • re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B

            • re.X 使我们以更灵活的格式理解正则表达式

      • 功能

        • 扫描整个字符串,并返回第一个成功的匹配

    • re.findall函数

      • 原型 re.findall(patter,string,flags =0)

      • 参数

        • patter 匹配的正则表达式

        • string 要匹配的字符串

        • flags:标志位,用于控制正则表达式的匹配方式

          • 值如下

            • re.I 忽略大小写

            • re.L 做本地户识别

            • re.M 多行匹配,影响^ 喝$

            • re.S 是. 匹配包括换行符在内的所有字符

            • re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B

            • re.X 使我们以更灵活的格式理解正则表达式

      • 功能:

        • 扫描整个字符串,并返回结果列表

    • 正则表达式的元字符

      • 匹配单个字符与数字

        • . 匹配除换行符以外的任意字符

        • [0123456789] []是字符集合,表示匹配方括号所包含的任意一个字符

        • [sunck] 匹配 ‘s‘,‘u‘,‘n‘,‘c‘,‘k‘ 中任意一个字符

        • [a-z] 匹配任意

        • [A-Z] 匹配任意大写字母

        • [0-9] 匹配任意数字,类似[0123456789]

        • [0-9a-zA-Z] 匹配任意的数字和字母

        • [0-9a-zA-Z_] 匹配任意的数字和字母和下划线

        • [^sunck] 匹配除了sunck这几个字母以外的所有字符,中括号里的^称为脱字符,表示不匹配集合中的字符

        • [^0-9] 匹配所有的非数字字符

        • \d 匹配数字,效果同[0-9]

        • \D 匹配非数字字符,效果同 [ ^ 0-9]

        • \w 匹配数字,字母和下划线 效果同[0-9a-zA-Z_]

        • \W 匹配非数字、字母和下划线,效果同[ ^0-9a-zA-Z_]

        • \s 匹配任意的空白符(空格、换行、换页,制表、回车),效果同[ \f\n\r\t]

        • \S 匹配任意的非空白符 效果同(^ \f\n\r\t)

      • 锚字符(边界字符)

        • ^ 行首匹配,和在[]里的^ 不是一个意思

        • $ 行尾匹配

        • \A 匹配字符串开始,它和^的区别是,\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首

        • \Z 匹配字符串结束,它和$的区别是,\Z只匹配整个字符串的结束,即使在re.M模式下也不会匹配它行的行尾

        • \b 匹配一个单词的边界,也就是此单词和空格间的位置

          • ‘er\b‘ 可以匹配never,不能匹配nerve

        • \B 匹配非单词边界

      • 匹配多个字符

        • 说明:下方的x、y、z均为假设的普通字符,n,m(非负整数),不是正则表达式的元字符

        • (xyz) 匹配小括号里面的xyz(作为一个整体去匹配)

        • x? 匹配0个或者1个x

          • #非贪婪匹配(尽可能少的匹配)

        • x* 匹配0个或者任意多个x(.* 表示匹配0个或者任意多个字符(换行符除外))

          • #贪婪匹配(尽可能多的匹配)

        • x+ 匹配至少一个x

          • #贪婪匹配(尽可能多的匹配)

        • x{n} 匹配确定的n个x(n是一个非负整数)

        • x{n,} 匹配至少n个x,

          • #贪婪匹配(尽可能多的匹配)

        • x{n,m} 匹配至少n个最多m个x 注意:n<=m

        • x|y |表示或、匹配的是x或y

      • 特殊

        • *? +? x? 最小匹配 通常都是尽可能多的匹配,可以使用这种解决贪婪匹配

        • (?:x) 类似(xyz),但不表示一个组

    • re模块深入

      • 字符串切割

        • re.split(patter,string)

          • patter 匹配的正则表达式

          • string 要匹配的字符串

      • re.finditer函数

        • 原型

          • re.finditer(patter,string,flags =0)

        • 参数:

          • patter 匹配的正则表达式

          • string 要匹配的字符串

          • flags:标志位,用于控制正则表达式的匹配方式

            • 值如下

              • re.I 忽略大小写

              • re.L 做本地户识别

              • re.M 多行匹配,影响^ 喝$

              • re.S 是. 匹配包括换行符在内的所有字符

              • re.U 根据Unicode 字符集 解析字符 影响\w \W \b \B

              • re.X 使我们以更灵活的格式理解正则表达式

        • 功能:与findall类似,扫描整个字符串,返回的是一个迭代器

      • 字符串的替换和修改

        • re.sub(pattern,repl,string,count = 0,flags=0)

        • re.subn(pattern,repl,string,count =0,flags = 0)

        • 参数

          • pattern : 正则表达式(规则)

          • repl : 指定的用来替换的字符串

          • string: 目标字符串

          • count: 最多替换次数

        • 功能:

          • 在目标字符串中,以正则表达式的规则匹配字符串,在把他们替换成指定的字符串,可以指定替换的次数,如果不指定,替换所有的匹配字符串

        • 区别:

          • 前者返回一个被替换的字符串,后者返回一个元组(第一个元素表示被替换的字符串,第二个元素表示被替换的次数)

    • 分组

      • 概念: 除了简单的判断是否匹配之外,正则表达式还有提取子串的功能。用()表示的就是提取分组

      • 举例

        • str6 = "010-53247654"

        • m = re.match(r"(?P<first>\d{3})-(d{8}),str6)

          • ?P<first> 是给组取名字

          • print(m.group(first)) 取的就是那组的数据

        • print(m.group(0))

        • print(m.group(1))

        • print(m.group(2))

          • 使用序号获取对应组的信息,group(0)一直代表的原始字符串

        • print(m.groups())

          • 查看匹配的各组的情况

    • 编译

      • 当我们使用正则表达式时,re模块会干两件事

        • 编译正则表达式,如果正则表达式本身不合法,会报错

        • re.compile(pattern,flags=0)

        • pattern: 要编译的正则表达式

          • 举例

            • pat = r"^1(([3578]\d)|(47))\d{8}$"

            • #编译成正则对象

            • re_telephon = re.compile(pat)

            • re_telephon .match(136000000)

        • 用编译后的正则表达式去匹配对象

相关推荐