Learning Diary for Python - 17
一、正则表达式
1.匹配类符号
# 1. 正则表达式
"""
正则表达式是一种可以让一些复杂的字符串问题变得简单的工具。
"""
# 2. 正则语法(通用)
# 1)re模块:
# fullmatch(正则表达式, 字符串) - 判断整个字符串是否满足正则表达式描述的规则(完全匹配)
# python提供正则表达式的方法:提供一个字符串,字符串内容是一个正则表达式,这个字符串的最前面需要加r
# python的正则表达式: r'正则'
# js的正则表达式: /正则/
# oc的正则表达式:"正则"
# 2)正则语法内容
# 包括:匹配类符号、控制次数的符号、分组和分支、检测类符号
# 3.匹配类符号 - 约束字符串中某个位置上的字符是什么样的字符
# 1)普通符号(字符)
"""
在正则表达式表示字符本身的符号就是普通符号(除了特殊符号以外的都是普通符号)
"""
from re import fullmatch
# r'abc' - 表示一个字符串有三个字符,分别是a、b和c
result = fullmatch(r'abc', 'abc')
print(result)
# 2) . - 匹配任意一个字符
# r'.bc' - 表示一个字符串,有3个字符,第一个字符是任意字符,第2个和第3个分别是b和c
result = fullmatch(r'.bc', '好bc')
print(result)
result = fullmatch(r'x..y', 'x-8y')
print(result)
# 3) \d - 匹配任意一个数字字符
result = fullmatch(r'x\dy', 'x6y')
print(result)
# 4) \s - 匹配任意一个空白字符
# 空白字符:任何可以产生空白效果的符号,例如:空格、\t、\n
result = fullmatch(r'x\sy', 'x\ny')
print(result)
# 5) \D - 匹配任意一个非数字字符
result = fullmatch(r'x\Dy', 'xMy')
print(result)
# 6) \S - 匹配任意一个非空白字符
result = fullmatch(r'x\Sy', 'xay')
print(result)
# 7) [字符集] - 匹配字符集中的任意一个字符
"""
[mnab] - 匹配m或者n或者a或者b
[\dmn]、[m\dn] - 匹配任意数字或者m或者n
[\d\s] - 匹配任意数字或者任意空白
[1-9] - 匹配1到9中任意数字
[0-9] - 和\d效果一样
[a-z] - 匹配任意一个小写字母
[1-5a-z] - 匹配数字1到5或者任意小写字母
[A-Za-z] - 匹配任意一个字母
[\u4e00-\u9fa5] - 匹配任意一个中文
[\u4e00-\u9fa5wp] - 匹配任意一个中文或者w或者p
"""
result = fullmatch(r'x[Mn3+]y', 'xMy')
print(result)
result = fullmatch(r'x[\u4e00-\u9fa5\dwp]y', 'x3y')
print(result)
# 8) [^字符集] - 匹配不在字符集中的任意一个字符
result = fullmatch(r'x[^mn]y', 'x-y')
print(result)
result = fullmatch(r'x[^\u4e00-\u9fa5]y', 'x0y')
print(result)
2.控制次数的符号
from re import fullmatch, search, findall
# 控制次数的符号的用法: 匹配类符号次数
# 1. * - 任意次数(0或者多次)
"""
a* - a出现0次或者多次
\d* - \d出现0次或者多次(任意数字出现0次或者多次)
[abc]* - [abc]出现0次或者多次
"""
print(fullmatch(r'xa*y', 'xy'))
print(fullmatch(r'xa*y', 'xay'))
print(fullmatch(r'xa*y', 'xaaaay'))
print(fullmatch(r'x\d*y', 'xy'))
print(fullmatch(r'x\d*y', 'x121029000y'))
# 2. + - 至少一次(1次或多次)
print(fullmatch(r'xa+y', 'xy')) # None
print(fullmatch(r'xa+y', 'xaaaaay'))
print(fullmatch(r'x[\u4e00-\u9fa5]+y', 'x函数y'))
# 3. ? - 0次或者1次
# 277、-728、+723
print(fullmatch(r'[+-]?[1-9]\d\d', '810'))
print(fullmatch(r'❤?xy', '❤xy'))
# 4.{}
"""
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
"""
print(fullmatch(r'1[3-9]\d{9}', '13892839283'))
print(fullmatch(r'123a{4}', '123aaaa'))
print(fullmatch(r'123a{2,4}', '123aaa'))
print(fullmatch(r'123a{2,}', '123aaaaaaaa'))
# 练习:写一个正则表达式可以匹配任意一个整数字符串
# 123、23、1、+23、-23、100,2, 2312312 - 合法
# 0002、23s、+-23、01 - 不合法
print(fullmatch(r'[+-]?[1-9]\d*', '10'))
# 4. 贪婪和非贪婪模式(了解)
# 在匹配次数不确定的时候,匹配次数有贪婪和非贪婪两种模式
"""
1)
默认是贪婪模式:*、+、{M,N}、{M,}、{,N}
贪婪模式:如果多种匹配次数都可以匹配成功,最后取最大的次数进行匹配
2)
非贪婪模式:*?、+?、{M,N}?、{M,}?、{,N}?
非贪婪模式:如果多种匹配次数都可以匹配成功,最后取最小的次数进行匹配
"""
# 贪婪
print(search('a.+b', '上访户大富豪amnbxybmnhjb按实际符合sdf')) # 'amnbxyb'
# 非贪婪
print(search('a.+?b', '上访户大富豪amnbxybmnhjb按实际符合sdf')) # 'amnb'
print(search('a.+b', '上