总结
一. 检测类符号
1.\b - 检测是否是单词边界
单词边界: 凡是可以两个单词分开的符号都是单词边界, 比如: 空白字符, 标点符号对应的字符, 字符串开头和结尾
注意: 检测类符号是在匹配成功的情况下看检测类符号所在的位置是否符号要求.
2. \B - 检测是否不是单词边界
3. ^ - 检测是否是字符串开头
4. $ - 检测是否是字符串结尾
二. 匹配次数
1. * - 0次或者多次
2. + - 1次或者多次
3. ? - 0次或者1次
4. {}
{N} - 匹配N次
{M,N} - 匹配M到N次
{M,} - 匹配最少M次
{,N} - 匹配最多N次
5. 贪婪和非贪婪
在匹配次数不确定是时候才有贪婪和非贪婪两种模式.
贪婪: 在能匹配成功的前提下取匹配次数最多的次数.(默认)
非贪婪: 在能匹配成功的前提下取匹配次数最少的次数.(在匹配次数后加?)
三. 分组和分支
1. 分组 - ()
用法一: 将正则表达式中的一部分作为一个整体, 进行整体相关操作, 比如控制次数
用法二: 重复 - 使用\M来重复前面第M个分组中的内容
用法三: 捕获
2. 分支
正则表达式1|正则表达式2 (类似与or)
先让正则1和字符进行匹配, 如果成功就成功, 如果失败就和正则2进行匹配.
如果正则2成功结果匹配成功, 否则匹配失败
3. 转义符号
在本身具备特殊功能或者特殊意义的符号前加, 让其功能或者意义消失, 表示一个普通符号
注意: 独立具备特殊功能的符号在[]中功能会自动消失, 例如: +, *, ?, ., (, )等
本身在[]中有特殊意义的就要特别注意: ^ , - , [, ]
四. re模块
1. compile(正则表达式) - 创建一个正则表达式对象
2. 匹配类方法
1) fullmatch
fullmatch(正则表达式, 字符串) / 正则表达式对象.fullmatch(字符串)
判断整个字符串是否符合正则表达式描述的规则, 如果不符合返回None, 符合返回匹配对象.
2) match
match(正则表达式, 字符串) / 正则表达式对象match(字符串)
判断字符串开头是否符合正则表达式描述的规则, 如果不符合返回None, 符合返回匹配对象.
3) 获取匹配结果
匹配对象.group() - 获取整个正则表达式匹配到的结果
匹配对象.group(N) - 获取正则表达式中第N个分组匹配到的结果
4) 获取匹配结果在原字符中的位置
匹配对象.span()
匹配对象.span(N)
5) 获取原字符
匹配对象.string
3. 查找类方法
search(正则表达式, 字符串) / 正则表达式对象.search(字符串)
获取字符串中第一个满足正则表达式的子串, 如果没有返回None, 否则返回匹配对象
findall(正则表达式, 字符串) / 正则表达式对象.findall(字符串)
获取字符串中所有满足正则表达式的子串, 以列表的形式返回, 列表中的元素是字符串
如果正则中有分组, findall只提取匹配结果中分组匹配到的内容
finditer(正则表达式, 字符串) / 正则表达式对象.finditer(字符串)
获取字符串中所有满足正则表达式的子串, 返回值是迭代器, 迭代器中的元素是匹配对象
4. 切割
split(正则表达式, 字符串) / 正则表达式对象.split(字符串)
将字符串中所有满足正则表达式的子串作为切割点对字符串进行切割
split(正则表达式, 字符串, 最大切割数)
5. 替换
sub(正则表达式, 字符串1, 字符串2) / 正则表达式对象.sub(字符串1, 字符串2)
将字符串2中所有满足正则表达式的子串都替换成字符串1
五. 匹配参数
1.单行匹配和多行匹配
默认是多行匹配
多行匹配的时候, 不能和\n(换行)匹配; 单行匹配的时候, 可以和\n匹配
单行匹配:
fullmatch(正则表达式, 字符串, flags=S) / 正则表达式对象.fullmatch(字符串, flage=S)
S是从re模块导入的
fullmatch((?s)正则表达式, 字符串)
2. 忽略大小写
默认不忽略大小写
忽略大小写的时候, 大写字母可以和对应的小写字母匹配, 小写字母也可以和对应的大写字母匹配
fullmatch(正则表达式, 字符串, flages=I) / 正则表达式对象.fullmatch(字符串, flages=I)
I是从re模块导入的
fullmatch((?i)正则表达式, 字符串)
单行匹配和大小写同时进行
flages=I|S
在正则表达式前面加(?si)
六. 编程思想
面向过程编程(穷人思想) - 逻辑+算法
函数式编程(小资思想) - 函数
面向对象编程(富豪思想) - 类和对象
类和对象
什么是类: 具有相同功能和相同属性的对象的集合 - 抽象的概念
什么是对象: 对象就是类的实例
作业
利用正则表达式完成下面的操作:
一、不定项选择题
- 能够完全匹配字符串
"(010)-62661617"和字符串"01062661617"的正则表达式包括(A B D)
A.r"\(?\d{3}\)?-?\d{8}"
B. r"[0-9()-]+"
C.r"[0-9(-)]*\d*"
D.r"[(]?\d*[)-]*\d*"
能够完全匹配字符串“back”和“back-end”的正则表达式包括(A B C D )
A. r“\w{4}-\w{3}|\w{4}”
B. r“\w{4}|\w{4}-\w{3}”
C. r “\S+-\S+|\S+”
D. r“\w*\b-\b\w*|\w*”能够完全匹配字符串“go go”和“kitty kitty”,但不能完全匹配“go kitty”的正则表达式包括(A C D)
A. r “\b(\w+)\b\s+\1\b”
B. r“\w{2,5}\s*\1”
C. r“(\S+)\s+\1”
D. r“(\S{2,5})\s{1,}\1”能够在字符串中匹配“aab”,而不能匹配“aaab”和“aaaab”的正则表达式包括(BC )
A. r“a*?b”
B. r“a{,2}b”
C. r“aa??b”
D. r“aaa??b”
二、编程题
1.用户名匹配
要求: 1.用户名只能包含数字 字母 下划线
2.不能以数字开头
3.长度在 6 到 16 位范围内
re_str = input()
print(fullmatch(r'(?i)[a-z_][\da-z_]{5,15}', re_str))
-
密码匹配
要求: 1.不能包含!@#¥%^&*这些特殊符号 2.必须以字母开头 3.长度在 6 到 12 位范围内
re_str = input()
print(fullmatch(r'(?i)[a-z][^!@#¥%^&*]{5,11}', re_str))
- ipv4 格式的 ip 地址匹配
提示: IP地址的范围是 0.0.0.0 - 255.255.255.255
re_str = r'247.010.198.2'
re_str = r'1.1.1.1'
print(fullmatch(r'((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])', re_str))
- 提取用户输入数据中的数值 (数值包括正负数 还包括整数和小数在内) 并求和
例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86
re_str = r'012324faiawe-0123faeaf-12432.132fawe-0.12342-afe3421+134.0'
result = findall(r'-?[1-9]\d*\.?\d*|0\.\d*', re_str)
str1 = '+'.join(x for x in result if x)
print(eval(str1))
-
验证输入内容只能是汉字
re_str = input('请输入汉字:') result = fullmatch(r'[\u4e00-\u9fa5]+', re_str) print(result)
-
匹配整数或者小数(包括正数和负数)
re_str = r'012324faiawe-0123faeaf-12432.132fawe-0.12342-afe3421+134.0' result = fullmatch(r'[+-]?[1-9]\d*\.?\d*|0\.\d+|0', re_str) print(result)
-
验证输入用户名和QQ号是否有效并给出对应的提示信息
要求:
用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
QQ号是5~12的数字且首位不能为0re_id = r'helloworld' print(fullmatch(r'\(?i)[a-z\d_]{6,20}', re_id)) re_qq = r'312422' print(fullmatch(r'[1-9]\d{4,11}', re_qq))
-
拆分长字符串:将一首诗的中的每一句话分别取出来
poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
poem = r'窗前明月光,疑是地上霜.举头望明月,低头思故乡.'
result = findall(r'[\u4e00-\u9fa5]+', poem)
for x in result:
print(x)