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

正则表达式

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

正则表达式

正则表达式

正则表达式是可以让复杂的字符串问题变得简单的工具

1,正则语法(编程语言通用)

re模块

fullmatch(正则表达式, 字符串) ---- 判断字符串是否满足正则表达式描述的规则(完全匹配)Python提供正则表达式的方法 ---- 提供一个字符串字符串内容是一个正则表达式,字符串最前面要加r(r’正则’)

语法内容

包含:匹配类符号、控制次数的符号、分组和分治、检测类符号 2,匹配类符号

普通字符

在正则表达式中表示字符本身的符号就是普通符号(出特殊符号外都是普通符号)

result1 = fullmatch(r"abc", "abc")
print(result)

特殊符号:"." ---- 表示匹配任意一个字符,一个"."匹配一个字符。

result2 = fullmatch(r"..bc", "傻呗bc")
print(result2)

特殊符号:"d" ---- 匹配任意一个数字字符, 一个"d"匹配一个字符

result3 = fullmatch(r"..ddbc", "傻呗33bc")
print(result3)

特殊符号:"s" ---- 匹配任意一个空白字符

空白字符:任何可以产生空白效果的符号(空格、t, n)

result4 = fullmatch(r"sy", "ny")
print(result4)

特殊符号:"D" ---- 匹配任意一个非数字字符

result5 = fullmatch(r"xyD", "xyy")
print(result5)

特殊符号:"S" ---- 匹配任意一个非空白字符

特殊符号:"[字符集]" ---- 匹配字符集中的任意一个字符

result6 = fullmatch(r"x[u4e00-u9fa5]...y", "x傻呗刘晋y")
print(result6)

"""
常见:特殊符号字符集
[多个普通符号]:[abcd]匹配a, b, c, d中任意一个
[1-9]:匹配1到9任意数字
[a-z]:
[A-Za-z]:
[u4e00-u9fa5]:匹配任意中文
"""

特殊字符:"[^字符集]" ---- 匹配不在字符集中的任意一个字符(除了字符集以外的任意字符)

result7 = fullmatch(r"y[^Python]x", "y0x")
print(type(result7))
3,控制次数符号

控制次数的符号的用法 ---- 匹配类符号 + 次数

" * " ---- 任意次数(0次或者多次)

print(fullmatch(r"xd*y", "x33333333333333333333333333333333333y"))
print(fullmatch(r"d*", "654678987654456789876544567"))

" + " ---- 至少一次(1次或者多次)

print(fullmatch(r"xd+y", "x33333333333333333333333333333333333y"))
print(fullmatch(r"d+", "654678987654456789876544567"))

" ? " ---- 0次或者1次(有或者没有)

print(fullmatch(r"❤?xy", "❤xy"))

" {} "

{N} ---- N次
{M,N} ---- M到N次
{M,} ---- 至少M次
{,N} ---- 至多N次
"""
print(fullmatch(r"py{10,}", "pyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"))
print(fullmatch(r"s{2,}b{3,}","sssssssssssssssssssssbbbbbbbbbbbbbbbbbbbbbbbbbbb"))
4,贪婪和非贪婪

在匹配次数不确定的时候,匹配次数有贪婪和非贪婪模式

默认是贪婪模式:*, +, {M,N}, {M,}, {,N}

贪婪模式:如果多种匹配次数都可以匹配成功,最后取最大的次数进行匹配

非贪婪模式

次数后面加’ ? '号非贪婪模式:*?, +?, {M,N}?, {M,}?, {,N}?非贪婪模式:如果多种匹配次数都可以匹配成功,取最小的次数进行匹配 5,分组和分支

分组 ---- ()

将正则的一部分用()括起来表示一个分组,然后整体控制次数捕获:findall函数在正则表达式中重复匹配结果:在正则中用()添加分组,然后用 "m"来重复前面第m个分组的匹配结果

(* ̄(oo) ̄):分组在m的前面

分支 ---- “/”

正则1|正则2|正则3|…(* ̄(oo) ̄):如果是正则的部分要进行分支选择,需要将部分分支地方加() 6,检测类符号

检测符号所在位置是否符合条件(必须是在匹配成功条件下才检测)

单词边界 – b (匹配成功的前提下)

检测b所在的位置是否是单词边界。单词边界:凡事可以将两个单词区分开的符号都是单词边界,比如:字符串开头,字符串结尾,空白字符,标点符等。检测类符号不影响字符串长度

检测字符串开头 - ^

检测字符串结尾 - $

result = findall(r"^d{2}", "987暗示打开水打卡机12 爱江山打卡机开始的23;12sjdasdkhakj12。124jhjhg雷克萨和打卡机66")
print(result)
7,转义符号

在正则中本生具备特殊功能或者特殊意义的符号前加“”,让他的功能消失,变成普通符号

[]也可以让独立存在有特殊意义的符号功能消失

+, *, ?, ., ^, $, |等,需要注意的是^和-在[]中的意义,[]在[]中需要加

print(fullmatch(r"d{2}.d{2}", "12.23"))
print(fullmatch(r"d+d", "2+2"))
8,re模块的常用函数和功能

fullmatch(正则,字符串) ---- 判断整个字符是否满足正则描述的规则,如果不满足结果是None,满足返回匹配对象

match(正则,字符串) ---- 匹配字符串开头,满足返回匹配对象,否则返回None

search(正则,字符串) ---- 在整个字符串中查找第一个满足正则表达式的字串,如果找不到返回None。否则返回匹配对象。

findall(正则,字符串) ----获取整个字符串中所有满足正则的字串,返回一个列表(注意分组问题)

finditer(正则,字符串) ----获取整个字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象

sub(正则,字符串1,字符串2) ---- 将字符串2中所有满足正则表达式的字符替换成字符串1

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

练习

1,能够完全匹配字符串"(010)-62661617"和字符串"01062661617"的正则表达式包括( A, B, C, D)

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

2,能够完全匹配字符串"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-bw*|w*'

3,能够完全匹配字符串"go go"和"kitty kitty",但不能完全匹配“go kitty”的正则表达式包括(A, C, 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,C )
A. r"a*?b"
B. r"a{,2}b"
C. r"aa??b"
D. r"aaa??b"

编程

1.用户名匹配

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

​ 2.不能以数字开头

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

user_name = input("请输入用户名:")
print(fullmatch(r"[_A-Za-z][0-9_A-Za-z]{5,15}", user_name))
    密码匹配

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

​ 2.必须以字母开头

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

password = input("请输入密码:")
if fullmatch(r"[a-zA-Z][^!@#¥%^&*]{5,11}", password):
    print("密码格式正确!")
else:
    print("密码格式错误!")

3,ipv4 格式的 ip 地址匹配
提示: IP地址的范围是 0.0.0.0 - 255.255.255.255

 

4,提取用户输入数据中的数值 (数值包括正负数 还包括整数和小数在内) 并求和

def func(date):
    count = 0
    for x in findall(r"-?d+.?d*", date):
        count += eval(x)
    return count


date1 = input("输入数据:")
print(func(date1))

5,验证输入内容只能是汉字

value = input("请输入内容:")
print(fullmatch(r"[u4e00-u9fa5]*", value))

6,匹配整数或者小数(包括正数和负数)

num = input("输入数据:")
print(fullmatch(r"[-+]?(0|[1-9]d+)|[-+]?d+.d+", num))

7,验证输入用户名和QQ号是否有效并给出对应的提示信息

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

def func(user_num, qq_num):
    if fullmatch(r"[0-9a-zA-Z_]{6,20}", user_num):
        print("用户名格式正确!")
    else:
        print("用户名格式错误")
    if fullmatch(r"[1-9]d{4,11}", qq_num):
        print("QQ格式正确!")
    else:
        print("QQ格式错误!")


user_num1 = input("请输入用户名:")
qq_num1 = input("请输入qq号:")
func(user_num1, qq_num1)

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

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

poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡'
print(split(r"。", '窗前明月光,疑是地上霜。举头望明月,低头思故乡')[0])
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/757373.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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