day 17-正则学习总结

day 17-正则

1. 认识正则

rom re import fullmatch, findall

1. 什么是正则表达式

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

# 1)验证输入的数据是否是一个合法的手机号
# tel = input('请输入手机号:')

# if len(tel) != 11:
#     print('不是手机号')
# else:
#     if tel.isdigit():
#         if tel[0] != '1':
#             print('不是手机号')
#         else:
#             if tel[1] in '012':
#                 print('不是手机号')
#             else:
#                 print('是手机号')
#     else:
#         print('不是手机号')


# result = fullmatch(r'1[3-9]\d{9}', tel)
# if result:
#     print('是手机号')
# else:
#     print('不是手机号')
# 2)提取字符串中所有的数字字串
str1 = '数据3637元环境设计0933汉江师范32hsjf8.98元'
# ['3637', '0933'. '32', '8.98']
# [3637, 8.98]

result = findall(r'\d+\.*\d*', str1)
print(result)


result = findall(r'(\d+\.*\d*)元', str1)
print(result)

2.正则匹配符号

from re import fullmatch

fullmatch(正则表达式, 字符串) - 让正则表达式和指定的字符串进行完全匹配(判断整个字符串是否符合正则表达式式所描述的规则)

正则表达式 - python中用字符串(带r的字符串)来表示—个正则表达式

1.普通字符

在正则表达式中表示符号本身的字符就是普通字符

在正则表达式中表示符号本身的字符就是普通字符
result = fullmatch(r'abc', 'abc')
print(result)

2…

匹配任意一个字符

result = fullmatch(r'a.c', 'a胡c')
print(result)

3.\d

匹配任意一个数字

result = fullmatch(r'a\d\dc', 'a26c')
print(result)

4.\s

匹配任意一个空白字符

空白字符 - 可以产生空白效果的字符,包括:空格、回车(\n)、水平制表符(\t)

result = fullmatch(r'a\sc', 'a\tc')
print(result)

5.\w

匹配任意一个数字、字母、下划线或者中文

result = fullmatch(r'a\wc', 'a胡c')
print(result)

6.\D、\S、\W

(和对应的小写字母功能相反)

result = fullmatch(r'a\Dc', 'a-c')
print(result)

7.[字符集]

匹配在字符集中的任意一个字符

用法1:

中括号中直接写多个普通字符,例如:[ma1,]

用法2:

中括号中包含反斜杠开头的特殊符号,例如:[ma1,\d]

用法3:

中括号中减号放在两个字符之间表示范围,例如:[1-7]

result = fullmatch(r'a[ma1,]c', 'amc')
print(result)

result = fullmatch(r'a[m\da,]c', 'a0c')
print(result)

result = fullmatch(r'a[1-7]c', 'a2c')
print(result)

result = fullmatch(r'a[A-Z]c', 'aPc')
print(result)

result = fullmatch(r'a[m,A-Z]c', 'a,c')
print(result)

result = fullmatch(r'a[\u4e00-\u9fa5]c', 'a吗c')
print(result)

注意:[]中 - 在两个字符之间才表示从谁到谁,并且减号前面的字符的编码值必须小于减号后面的字符的编码值;

[]中 - 如果不在两个字符之间,- 就是一个普通符号,表示这个符号本身

# result = fullmatch(r'a[a-M]c', 'a2c')     # 报错
result = fullmatch(r'a[-AZ]c', 'a-c')
print(result)

8.[ ^ 字符集]

匹配任意一个不在字符集的任意一个字符

result = fullmatch(r'a[^MNX]c', 'aOc')
print(result)

result = fullmatch(r'a[^1-9]c', 'a胡c')
print(result)
# \d  == [0-9]
# \D  == [^0-9]
# \s  == [ \n\t]
# \S  == [^ \n\t]
# \w  == [a-zA-Z0-9_\u4e00-\u9fa5]
# \W  == [^a-zA-Z0-9_\u4e00-\u9fa5]

注意:[]中,如果不在最前面,就表示这个符号本身

result = fullmatch(r'a[M^NX]c', 'a^c')
print(result)

3.正则匹配次数

from re import *

1.+

匹配一次或者多次(至少一次)

匹配符号+

result = fullmatch(r'a+b', 'aaaaab')
print(result)

result = fullmatch(r'.+b', 'ms,.a.sfhjahjfh27272mbmncbcsdsfa手动阀b')
print(result)

result = fullmatch(r'\d+b', '7282771829839393b')
print(result)

result = fullmatch(r'[MN1-6]+b', '3M5N16Nb')
print(result)

2.*

匹配0次或者多次(匹配任意多次)

result = fullmatch(r'a*b', 'aaaab')
print(result)

3.?

匹配0次或者一次

result = fullmatch(r'\d?b', '2b')
print(result)

4.{}

{N} - N次

{M,N} - M到N次

{M,} - 至少M次到无限

{,N} - 最多N次

result = fullmatch(r'a{3}b', 'aaab')
print(result)

result = fullmatch(r'a{2,5}b', 'aaab')
print(result)

result = fullmatch(r'a{5,}b', 'aaaaaab')
print(result)

result = fullmatch(r'a{,5}b', 'aab')
print(result)
# 练习:写一个正则可以匹配任意一个整数字符串
# '1923'、'-234'、'+234'、'2'、'-2' 、   -   合法
# 'agg2'、'23.23'  '01'  -  不合法
# 0 不考虑
str1 = '+6272'
result = fullmatch(r'[-+]?[1-9]\d*', str1)
if result:
    print('合法')
else:
    print('不合法')


# 练习2:写一个正则表达式匹配一个变量名,变量名要求:由数字、字母下划线组成,数字不能开头
name = '9ab2c'
result = fullmatch(r'[a-zA-Z_][a-zA-Z_\d]*', name)
if result:
    print('合法')
else:
    print('不合法')

4.贪婪和非贪婪

fullmatch(正则,字符串) - 完全匹配

match(正则,字符串) - 匹配字符串开头

search(正则,字符串) - 匹配字符串中第一个满足正则的子串

findall(正则,字符串) - 获取字符串中所有满足正则的子串

sub(正则,字符串1,字符串2) – 将字符串2中所有满足正则的子串都替换成字符串1

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

result = fullmatch('\d{3}', '123')
print(result)


result = match('\d{3}', '123化考核分用以8ysshjkfh')
print(result)

result = search('\d{3}', '阖家安康会234受到罚829款shfjka')
print(result)

result = findall('\d{3}', '阖家安康会234受到罚82202款shf278jka')
print(result)       # ['234', '822', '278']

在匹配次数不确定的情况下,匹配模式分为贪婪和非贪婪两种。

1.贪婪

在能匹配成功的前提下,如果有多种次数都能匹配成功,取最大次数

+、*、?、{M,N}、{M,}、{,N}

2.非贪婪

在能匹配成功的前提下,如果有多种次数都能匹配成功,取最小次数

+? 、*?、??、{M,N}?、{M,}?、{,N}?

# 2  -> amnb
# 6  -> amnb数据复b
# 9  -> amnb数据复baab
result = match(r'a.+b', 'amnb数据复baab计算机')
print(result)

result = match(r'a.+?b', 'amnb数据复baab计算机')
print(result)


result = match(r'a.+?b', 'amnb数据复aa计算机')
print(result)

result = match(r'a.+b', 'amnb数据复aa计算机')
print(result)
# 案例:用正则获取一个英雄所有皮肤的名字
file_content = read_file('files/data.json')
names = findall(r'"skinId":\s*"(.+?)",', file_content)
print(names)

5.分组和分支

1.分组:()

一个()就是一个分组

1)整体控制

将正则中需要看成一个整体来控制次数的地方用()括起来,作为一个分组

2)重复

在正则中可以通过\N来重复它前面第N个分组匹配到的结果

3)捕获

获取指定分组中的匹配结果(findall会自动捕获分组内容)

# 案例1:匹配,两个数字两个大写字母的结构重复三次:'12MN67HJ89KJ'
# 方法一:
result = fullmatch(r'\d\d[A-Z]{2}\d\d[A-Z]{2}\d\d[A-Z]{2}', '12MN67HJ89KJ')
print(result)

# 方法二:
result = fullmatch(r'(\d\d[A-Z]{2}){3}', '12MN67HJ89KJ')
print(result)


result = fullmatch(r'a\d{3}b', 'a678b')
print(result)

result = fullmatch(r'(a\d){3}b', 'a8a6a5b')
print(result)
# 案例2:匹配, '23a23'、'99a99'、'80a80'
result = fullmatch(r'(\d\d)a\1', '80a80')
print(result)


result = fullmatch(r'(\d{2})([A-Z]{3})-\1{3}\2', '23MKN-232323MKN')
print(result)


result = findall(r'[\u4e00-\u9fa5](\d+)', '哈2723数据环境设计29hjjhj902上飞机m82句话22')
print(result)

2.分支 - |

正则1|正则2 – 字符串如果可以和两个正则中的任意一个正则匹配成功就能匹配成功,两个都不能匹配就匹配失败

# 'abc728'、'abcMH'
result = fullmatch(r'abc\d{3}|abc[A-Z]{2}', 'abc342')
print(result)

result = fullmatch(r'abc(\d{3}|[A-Z]{2})', 'abcKJ')
print(result)

6. 检测类符号

工作原理:先匹配(在匹配的时候不用管检测符号),在匹配成功后再检测检测类所在的位置是否符合相关要求

1.\b

检测\b所在的位置是否是单词边界

单词边界:空白符号、英文的标点符号、字符串的开头和字符串结尾

result = fullmatch(r'm\b.n', 'm,n')
print(result)

result = findall(r'\b\d+\b', '881爱好728,数据m 8923就是,sjka829 80, 换手机90')
print(result)

2.^

检测是否是字符串开头

3.$

检测是否是字符串结尾

result = search(r'\d{3}$', '黑色金属2728jksjf829')
print(result)

result = search(r'^\d{3}$', '723')
print(result)

7. 转义符号

在本身具备特殊意义或者特殊功能的符号前加,让这个符号变成一个普通符号

result = fullmatch(r'\d\.\d', '2.3')
print(result)


result = fullmatch(r'\d\+\d', '2+3')
print(result)
# (72387)、(234)
result = fullmatch(r'\(\d+\)', '(2234)')
print(result)

在[门外面独立存在有特殊意义的符号,在[门]里面会自动变成普通符号,例:.、+、*、?、$等

result = fullmatch(r'\d[.]\d', '2.3')
print(result)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值