01语言基础-正则表达式20220505

01语言基础
正则表达式
01正则表达式

正则表达式: 解决字符串问题的工具(让复杂的字符串问题变得简单的一个工具)

02匹配类符号

from re import fullmatch
2.1.re模块
re模块是python用来支持正则表达式的一个模块
re模块中提供了各种和正则相关的函数:fullmatch,search,findall,match,split,sub等等
fullmatch(正则表达式,字符串) - 判断整个字符串是否完全符合正则表达式描述的规则,如果不符合返回的是None
python中提供正则表达式的方式:r’正则表达式’
2.2.匹配类符号 - 一个正则符号表示一类字符
匹配类符号在正则中的作用:用来要求字符串中某个位置必须是什么样的字符
1)普通符号 - 在正则表达式中表示这个符号本身,对应字符串中的字符的要求就是符号本身
2). -匹配任意一个字符
3)\d - 匹配一个任意数字
4) \s -匹配任意空白字符(空白字符包括:空格、\n,\t,\r)
5) \w - 匹配任意一个数字、字母或者下划线或者中文
6)\大写字母 - 与相应的小写字母的功能相反
\D - 匹配一个非任意数字
\S - 匹配任意非空白字符
\W -匹配任意一个非数字、字母或者下划线或者中文
7)[字符集] - 匹配字符集中任意一个字符(注意:一个[]只能匹配一个字符)
[多个普通符号] - 例如[zxc12],在五个中任意匹配一个
[包含\开头语的特殊符号]
[字符1-字符2] - 例如 ‘’‘[a-z][a-zA-Z][1-9a-z][\u4e00-\u9fa5]’‘’
注意:[]中如果-不在[]里面,则是普通符号
8)[^字符集] - 匹配不在字符集中的任意一个字符

03匹配次数

3.1 * - 匹配0次或者多次(任意次数)
3.2 + - 匹配1次或者多次(至少1次)
3.3 ? - 0次或1次
3.4 {}
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
* == {0,}
+ == {1,}
? == {0,1}
3.5 贪婪和非贪婪
在匹配次数不确定的时候,匹配模式分为贪婪和非贪婪,默认是贪婪
匹配次数不确定: * + ? {M,N} {M,} {,N}
贪婪和非贪婪:在次数不确定的情况下,对应的字符串在不同次数下有多中匹配结果,贪婪取最多次数对应的结果(前提匹配成功)非贪婪取最少次数对应的结果
贪婪:* + ? {M,N} {M,} {,N}
非贪婪:*? +? ?? {M,N}? {M,}? {,N}?

04分组和分支

4.1 分组 - ()分组就是在正则中用括号将正则中的部分内容括起来就形成一个分组
1)整体操作
2)重复:在正则中:\N 可以重复\N 所在的位置的前面的第N个分组匹配到的内容
3)捕获 - 获取正则匹配结果中的部分内容
4.2 分支
正则1|正则2 - 先用正则1匹配,如果成功就成功,如果匹配失败,就用正则2匹配

05检测类符号和转义符号

5.1检测类符号-检测类符号不是匹配符号,不会要求某个位置必须是什么样的字符,而是用来检测某个文字是否符合相关要求
1)\b - 检测是否是单词边界
单词边界 - 凡是可以用来将两个单词区分开的符号,例如:空白字符、标点符号、字符串开头和结尾
2)\B - 检测是否是非单词边界
3)^ - 检测是否是字符串开头([]外面)
4)$ - 检测是否是字符串结尾
5.2 转义符号
正则中的转义符号是指在本身就具备特殊功能的符号前加\,让它本身具备的特殊功能消失变成普通符号
补充:独立存在有特殊意义的符号,放到[]中特殊功能会直接消失变成一个普通符号:+ * . ?

06模块

import re
6.1 常用函数
1)re.fullmatch(正则,字符串) - 用整个字符串是否能够和正则匹配,如果匹配成功返回匹配对象,失败返回None
2)re.match(正则,字符串) - 匹配字符串开头,如果匹配成功返回匹配对象,失败返回None
3)re.search (正则,字符串)- 匹配字符串中第一个满足正则的子串,如果匹配成功返回匹配对象,失败返回None
4)re.findall(正则,字符串) - 获取字符串中所有满足正则的子串,返回值是列表,列表中的元素是匹配到的字符串
5)re.finditer (正则,字符串)- 获取字符串中所有满足正则的子串,返回的是迭代器,迭代器中的元素的匹配对象
6)re.split(正则,字符串)-将字符串中所有满足正则的字符串作为切割点进行切割,返回一个列表
7)re.sub(正则,字符串1,字符串2) - 将字符串2中所有满足正则的字符串替换成字符串1
6.2 匹配对象
1)获取匹配结果对应的字符串
a.获取整个正则匹配到的字符串:匹配对象.group()
b.获取某个分组匹配到的结果:匹配对象.group(N)
2)获取匹配结果在原字符串中的位置信息
6.3 参数
1)单行匹配和多行匹配
多行匹配的时候,不能和’\n’匹配(默认):flags=re.M / ?m
单行匹配的时候,能和’\n’匹配: flags=re.S / ?s
2)忽略大小写
默认情况下,大小写字母不能匹配,忽略大小写之后才可以和对应的大小写匹配
方法: flags=re.I / (?i)
3)即忽略大小写又要单行匹配
方法:flags=re.I|re.S \ (?is)

作业

利用正则表达式完成下面的操作:

一、不定项选择题

  1. 能够完全匹配字符串"(010)-62661617"和字符串"01062661617"的正则表达式包括(ABD )

    A. r"\(?\d{3}\)?-?\d{8}"
    B. r"[0-9()-]+"
    C. r"[0-9(-)]*\d*"
    D.r"[(]?\d*[)-]*\d*"

  2. 能够完全匹配字符串"back"和"back-end"的正则表达式包括(ABCD )
    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*'

  3. 能够完全匹配字符串"go go"和"kitty kitty",但不能完全匹配“go kitty”的正则表达式包括(AD)
    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'

  4. 能够在字符串中匹配"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 位范围内

result = re.fullmatch(r'(?i)[a-z_][a-z\d_]{5,15}','T45_sts')
print(result)
  1. 密码匹配

​ 要求: 1.不能包含!@#¥%^&*这些特殊符号

​ 2.必须以字母开头

​ 3.⻓度在 6 到 12 位范围内

result = re.fullmatch(r'(?i)[a-z][^!@#¥%^&*]{5,11}','T5_sts')
print(result)
  1. ipv4 格式的 ip 地址匹配
    提示: IP地址的范围是 0.0.0.0 - 255.255.255.255
ip = '0.134.55.124'
result = re.fullmatch(r'((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])',ip)
print(result)
  1. 提取用户输入数据中的数值 (数值包括正负数 还包括整数和小数在内) 并求和
例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86
result = re.finditer(r'-?\d+(\.\d+)?','-3.14good87nice19bye')
nums = [float(x.group()) for x in result]
print(sum(nums))


from functools import reduce
s = reduce(lambda i,item:i+float(item.group()),result,0)
print(s)
  1. 验证输入内容只能是汉字

    result = re.fullmatch(r'[\u4e00-\u9fa5]+','烦人')
    print(result)
    
  2. 匹配整数或者小数(包括正数和负数)

    result = re.fullmatch(r'[+-]?(\d|[1-9]\d+)(\.\d+)?','-9.65')
    print(result)
    
  3. 验证输入用户名和QQ号是否有效并给出对应的提示信息

    要求:
    用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
    QQ号是5~12的数字且首位不能为0

    use_name = 'due_12fue'
    qq = '977871164'
    result1 = re.fullmatch(r'(?i)[a-z0-9_]{6,20}',use_name)
    result2 = re.fullmatch(r'[1-9]\d{4,11}',qq)
    print(result1,result2)
    
  4. 拆分长字符串:将一首诗的中的每一句话分别取出来

    ​ poem = ‘窗前明月光,疑是地上霜。举头望明月,低头思故乡。’

poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
result = re.split(r'[,。]',poem)
print(result)

result = re.findall(r'[\u4e00-\u9fa5]+',poem)
print(result)

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