栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

正则表达式

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

正则表达式

正则表达式 1.概念

正则是一种可以让复杂的字符串问题变得简单的工具。并不是python特有的语法,所有的高级语言都支持。

如:判断手机号是否是正确的。

方法一:用常规方法

def is_tell(num: str):
    if len(num) != 11:
        return False

    for x in num:
        if not x.isdigit():
            return False
    if num[0] == 1:
        return True
    if "3" < +num[1] <= "9":
        return True

    return False

print(is_tell("1233456"))----false

    	

图二

from re import fullmatch
tel=input("输入一个电话号码")
result = fullmatch(r"1[3-9]d{9}",tel)
print(result)

不管通过正则表达式解决什么问题,写的时候都用正则表达式描述的规则

2.python的re模块

re模块是python用来支持正则表达式的模块,模块中包含了所有和正则相关的函数

fullmatch(正则表达式 , 字符串)-----判断正则表达式和指定的字符串是否完全匹配

成功返回匹配对象,失败返回None

from re import fullmatch
#引入正则模块
3.正则语法

匹配类符号

1.)普通符号------在正则表达式表示符号本身的符号

result = fullmatch(r"abc","abc")
print(result)
匹配

2).----匹配任何一个字符

result = fullmatch(r"a.c","abc")
print(result)
匹配
result = fullmatch(r"..c","abc")
print(result)
匹配---两个点匹配两个字符

3.) d----匹配任意一个数字字符

result = fullmatch(r"adc","a0c")
print(result)
匹配

4.) s----匹配任意一个空白字符

空白字符-----能产生空白效果的字符.例如:空格、换行、水平制表符

result = fullmatch(r"asc","a c")
print(result)
匹配

5.) D—匹配任意一个不是数字字符

result = fullmatch(r"aDc","a+c")
print(result)
匹配

6.) S—匹配任意一个非空白字符

result = fullmatch(r"aSc","a c")
print(result)
None

7.) [字符集]—匹配字符集中的任意一个字符

result = fullmatch(r"a[1-9]c","a7c")
print(result)
匹配

规律:

[abc]           匹配a或者b或者c
[abcd]         匹配a或者b或者c或者数字
[1-9]           匹配任意数字
[a-z]           匹配任意一个小写字母
[A-Z]           匹配任意一个大写字母
[a-zA-Z]        匹配任意一个字母
[u4e00--u9fa5]  匹配任意一个中文

8.)[ ^字符集]------不在字符集中的任意一个字符

result = fullmatch(r"a[^1-9]c","abc")
print(result)
匹配
4.匹配次数:

1.)* -----(0次或多次数)控制*前面字符的次数

a*-----多个a
result = fullmatch(r"a*c","aaaaaac")
print(result)

result = fullmatch(r"d*c","1234455c")
print(result)
  1. ±-----一次或多次
result = fullmatch(r"d+c","123c")
print(result)
  1. ?------0次或1次
result = fullmatch(r"d?c","1c")
print(result)

4.{ }

{M,N}-----M到N次

result = fullmatch(r"[a-z]{1,4}c","aaac")
print(result)

{M,}------至少M次

result = fullmatch(r"[a-z]{1}c","aaac")
print(result)

{,N}----最多N次

result = fullmatch(r"[a-z]{,2}c","aac")
print(result)

{N}----N次

result = fullmatch(r"[a-z]{2}c","aac")
print(result)
5.贪婪与非贪婪

当匹配次数不确定的时候,匹配模式为贪婪与非贪婪两种。默认是贪婪的

贪婪:在匹配成功的时候有多种匹配结果,贪婪取最多次数对应的匹配结果

from re import match
#match (正则表达式,字符串)-----判断字符串开头是否符合正则表达式描述的规则
result = match(r"a.+b","amb计算bxxxbmn")
print(result)
amb、amb计算、amb计算bxxxb
#结果默认取:amb计算bxxxb

非贪婪模式:次数最小的模式(在次数后面+?)

*?、+?、??、{M,N}?、{M,}?、{,N}?
result = match(r"a.+?b","amb计算bxxxbmn")
print(result)
amb #在次数后面加?,非贪婪模式
6.分组-----()

1.整体-----将正则表达式中的一部分作为一个整体进行相关操作

result = fullmatch(r"(dd[a-z]{2})+","12ab34av")
print(result)
#整体结构不断重复

2.重复------可以在正则表达式中通过M来重复它前面的第M个分组匹配结果

23m23、34m34
result = fullmatch(r"(dd)[a-z]1","12a12")
print(result)
#整体内容不断重复

3.捕获–只获取正则表达式中分组匹配到的结果

result = fullmatch(r"(dd)([a-z]{3})=21","12aas=aas12")
print(result)
7.分支—|

正则1|正则2|正则3|------匹配可以和多个正则中任意一个正则匹配的字符串–相等于选择

result = fullmatch(r"(dd)|([a-z]{3})","aas")
print(result)

#a234b amjhb
result = fullmatch(r"a(d{3}|[a-z]{3})b","a123b")
print(result)
如果想要正则表达式中的一部分实现多选一的效果,变化的部分用分组表示
8.转义符号

1.在本身具备特殊功能的特殊意义的符号前加" ",让这个字符体现本身含义

匹配任意一个小数对应的字符串
result = fullmatch(r"d+.d+","2.3566")
print(result)

如:+23
result = fullmatch(r"+d{2}","+23")
print(result)

如:?23
result = fullmatch(r"?d{2}","?23")
print(result)

2.[]里的转义符号

单独存在有特殊意义的符号(+、*、?.),在[]中特殊意义会自动消失

result = fullmatch(r"[?]d{2}","?23")
print(result)

本身在中括号中有特殊功能的符号,如果要表示普通符号必须加" "

result = fullmatch(r"a[MN-]b","a-b")
print(result)

result = fullmatch(r"a[M-N]b","a-b")
print(result)

3.检测类符号(了解)

在匹配成功的情况下,检测检测类符号所在的位置是否符号相关要求

1.b----检测是否是单词边界

单词边界:可以将两个单词分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头和字符串结尾

result = fullmatch(r'abcb mn', 'abc mn')
print(result)
#首先去掉b,与后面字符匹配,在判断是否有单词边界

2.B-----检测是否不是单词边界

message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'Bd+B', message)
print(result)
#['03', '4', '34', '9', '1', '3']一个又一个判断

3.^----检测是否是字符串开头

message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'^d+', message)
print(result)
#['203']

4.$—检测是否是字符串结尾

message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'd+$', message)
print(result)
#[]
9.模块常见函数

1.fullmatch(正则表达式,字符串)-----完全匹配,判断整个字符串是否符合描述规则—不考虑贪婪

result = fullmatch(r"a[M-N]b","a-b")
print(result)

2.match(正则表达式,字符串)-----匹配字符串开头,判断字符串开头是否符合正则表达式的规则。匹配成功返回匹配对象,

result = match(r'd{3}', '823介绍数据库')
print(result)

3.search(正则表达式,字符串)----获取字符串中第一个能够和正则匹配成功的子串。

result = search(r'd{3}', 'ba203还是678说')
print(result)
203

4.findall(正则表达式,字符串)----获取符合条件的字符串,返回一个列表

result = finditer(r'd{3}', 'ba203还是678说kk0222jksn就是23311')
print(list(result))
#['203', '678', '022', '233']

5.finditer(正则表达式,字符串)-----提取符合条件的字符串,返回一个迭代器,迭代器中的元素是每个子串对应的匹配结果

result = finditer(r'd{3}', 'ba203还是678说kk0222jksn就是23311')
print(list(result))
#[, , 

6.split(正则表达式,字符串-)-----将字符串中所有满足正则的子串作为切割点对字符进行切割

from re import split
str1 = '123aMKnb嗑生嗑死aKKssa923b==='
# 将str1中的a和k和b作为切割点对字符串进行切割
result = split(r'a|k|b', str1)
print(result) 
#['123', 'MKn', '嗑生嗑死', 'KKss', '923', '===']

7.sub(正则表达式,字符串1,字符串2)-----相当于replace,将字符串2中所有满足正则的子串都替换成字符串1

from re import sub
result = sub(r'd+', '+', 'ba203还是678说kk0222jksn就是23311')
print(result)

#ba+还是+说kk+jksn就是+

2.匹配对象

1)获取匹配结果:匹配对象.group( )

from re import search
result = search(r'd+', 'ba678203还是说kk0222jksn就是23311')
print(result.group())
#678203

2)某个分组的匹配结果:匹配对象.group(分组数)

from re import search
result = search(r'(d+)([a-z]+)', 'ba67820ghjkk0222jksngfgh23311ghjh')
print(result.group(1))
#67820

3)获取匹配结果在原字符串中的位置:匹配对象.span( )

from re import search
result = search(r'(d+)([a-z]+)', 'ba67820ghjkk0222jksngfgh23311ghjh')
print(result.span(1))
(2,7)---下标

3.参数

1)忽略大小写(?i)

from re import fullmatch
result = fullmatch(r'(?i)abc', 'aBC')
print(result)
匹配
作业 利用正则表达式完成下面的操作: 一、不定项选择题
  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"的正则表达式包括(A BC 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-bw*|w*'

  3. 能够完全匹配字符串"go go"和"kitty kitty",但不能完全匹配“go kitty”的正则表达式包括(A D)
    A.r'b(w+)bs+1b'
    B. r'w{2,5}s*1'
    C. r'(S+) s+1'
    D. r'(S{2,5})s{1,}1'

  4. 能够在字符串中匹配"aab",而不能匹配"aaab"和"aaaab"的正则表达式包括(B )
    A. r"a*?b"
    B. r"a{,2}b"
    C. r"aa??b"
    D. r"aaa??b"

二、编程题

1.用户名匹配

​ 要求: 1.用户名只能包含数字 字母 下划线

​ 2.不能以数字开头

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

from re import fullmatch
result=fullmatch(r"[a-zA-Z _][0-9 a-z A-Z _]{6,16}",   )

  1. 密码匹配

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

​ 2.必须以字母开头

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

from re import fullmatch
result=fullmatch(r"[a-zA-Z][a-zA-Z 0-9]{5,11}",       )

  1. ipv4 格式的 ip 地址匹配
    提示: IP地址的范围是 0.0.0.0 - 255.255.255.255
from re import search
result=search(r"d[,3].d[,3].d[,3].d[,3] ",       )

  1. 提取用户输入数据中的数值 (数值包括正负数 还包括整数和小数在内) 并求和
例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86
from re import findall
result=findall(r"-?d+.?d+", "-3.14good87nice19bye")
print(result)
sum1=0
for x in result:
    b=float(x)
    sum1+=b
print(sum1)

#102.86
  1. 验证输入内容只能是汉字
from re import fullmatch
result=fullmatch(r"[u4e00-u9fa5]+", "密码密码")
print(result)

  1. 匹配整数或者小数(包括正数和负数)
from re import fullmatch
result=fullmatch(r"-?d+.?d+", "-123.123")
print(result)
  1. 验证输入用户名和QQ号是否有效并给出对应的提示信息

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

    from re import fullmatch
    username=input("请输入账号")
    if fullmatch(r"[0-9 a-zA-Z _]{6,20}", username):
    	print(f"{username}有效")
    else:
    	print(f"{username}无效")
    
    pw=input("请输入账号")
    if fullmatch(r"[1-9]d{4,11}", pw):
    	print(f"{pw}有效")
    else:
    	print(f"{pw}无效")
    

    6.拆分长字符串:将一首诗的中的每一句话分别取出来

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

    from re import split
    result = split(r';', '窗前明月光,疑是地上霜。举头望明月,低头思故乡。')
    print(result) 
    
from re import findall
result = findall(r'[u4e00-u9fa5]{5}', '窗前明月光,疑是地上霜。举头望明月,低头思故乡。')
for x in range(len(result)):
    print(result[x])
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1038659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号