正则是一种让复杂的字符串问题变得简单的工具
#例子1:判断一个字符是否是手机号
#开头是1、第二位是3~9,后面是数字
# num='13022221111'
# print(fullmatch(r'1[3-9]\d{9}',num)!=None)
#2.正则语法
#1)re模块
#fullmatch(正则表达式,字符串)--判断字符串是否满足正则表达式的规则
#python提供正则表达式的方法:提供一个字符串,字符串内容是正则表达式,前面需要加r
#python的正则表达式:f'正则'
#js的正则的表达式:/正则/
#2)正则语法内容
#包括:匹配类符号、空值次数的符号,分组和分支,检测类符号
#3)匹配类符号-约束字符串中某个位置上的字符是什么样的字符
#1)普通符号(字符)
"""
在正则表达式表示字符本身的符号就是普通符号
"""
#r'abc'--表示一个字符串有三个字符,分别是abc
result=fullmatch(r'abc','abc')
print(result)
#2)-匹配任意一个字符
#r'.bc'-- .表示任意字符
result=fullmatch(r'.bc','Abc')
print(result)
#3)\d--匹配任意一个数字字符
result=fullmatch(r'x\dy','x1y')
print(result)
#4)\s -匹配任意一个空白字符
#空白字符:空格、\t,\n
result=fullmatch(r'x\sy','x y')
print(result)
#5)\D--匹配一个非数字字符
result=fullmatch(r'\D\D\D','111')
print(result,'D')
#6)\S--匹配一个非空白字符
result=fullmatch(r'\S\S\S1','abc1')
print(result)
#7)[字符集]--匹配字符集中任意一个字符
"""
[nma]
[\dnd]
[1-9] -匹配1-9
[0-9] -等于\s
[a-z] -匹配a-z
[1-5a-z] -匹配1到5或者任意小写字母
[\u4e00-\u9fa5]-匹配任意中文
"""
result=fullmatch(r'x[abc]y','xay')
print(result)
#8)[^字符集]-匹配不在字符集中的任意一个字符
#等于not 要在[]里面
result=fullmatch(r'a[^1-9]c','abc')
print(result)
#1.*--任意次数(0或者多次)
"""
a*---a出现0次或者多次
\d*---\d0次或者多次
[abc]*--[abc]任意一个出现0次或者多次
"""
result=fullmatch(r'xa*y','xy')
print(result)
result=fullmatch(r'xa*y','xaaaay')
print(result)
#2+--至少一个
result=fullmatch(r'xa+y','xy')
print(result) #None
result=fullmatch(r'xa+y','xay')
print(result) #
#3?--0或者1次
result=fullmatch(r'xa?y','xaay')
print(result) #None
result=fullmatch(r'xa?y','xy')
print(result) #
#4.{}
"""
{N} -n次
{M,N} -M-N次
{M,} -至少m次
{,N} -至多n次
"""
#练习:写一个正则表达式可以匹配任意一个整数
result=fullmatch(r'[+-]?[^0]\d*','12300')
print(result)
#5.贪婪或者非贪婪模式
#在匹配次数不确定的时候,匹配次数有贪婪和非贪婪两种模式
"""
默认是贪婪模式:*,+,{M,N},{M,},{,N}
贪婪模式:如果多种匹配次数都可以匹配成功,最后取最大次数的次数进行匹配
2)
非贪婪模式:*?,+?,{M,N}?,{M,}?,{,N}?
取最少的
"""
#search -- 只要有就符合,取第一个满足条件的
result=fullmatch(r'a\d*b','a2ba222222ba22212ba22221b')
print(result) #match='a2b'
#1.分组-()
"""
1)将正则的一部分用小括号括起来,表示一个分组,整体控制次数
"""
result=fullmatch(r'(ab){3}','ababab')
print(result) # match='ababab'>
#2)重复匹配结果
#在正则中用()添加分组,然后在正则用‘\N’来重复前面第N个分组匹配结果
result=fullmatch(r'abc(\d{3})mn\1','abc800mn801')
print(result) #None
result=fullmatch(r'abc(\d{3})mn\1','abc800mn800')
print(result) #match='abc800mn800'>
result=fullmatch(r'11(\s{3})22(\s{2})33\2','11 22 33 ')
print(result) #None
#3)捕获
str1='aa11bb33bbbaa22kjlkj22455jkk33'
result=findall(r'\d+',str1)
print(result) #['11', '33', '22', '22455', '33']
result=findall(r'[a-z]\d+',str1)
print(result) #['a11', 'b33', 'a22', 'j22455', 'k33']
result=findall(r'[a-z](\d+)',str1)
print(result) #['11', '33', '22', '22455', '33']
#分支
"""
正则1|正则2|正则3|。。。
相当于或者
"""
result=fullmatch(r'abc\d{2}|abc\d{3}','abc12')
print(result) #match='abc12'>
result=fullmatch(r'abc\d{2}|abc\d{3}','abc123')
print(result) # match='abc123'>
#1.检测类符号--检测符号所在的位置是否符合条件
#必须是在匹配成功的前提下才进行检测
#1)单词边界--\b
"""
检测\b所在的位置是否是单词边界
单词边界:凡是可以将2个单词区分开的符号,都是单词边界,比如:字符串开头、字符串结尾,标点符号
注意:检测类符号不影响字符串长度
"""
str1='11 how are 22you33!'
result=findall(r'\d{2}\b',str1)
print(result) #['11', '33']
#2)检测字符串开头---^
#3)检测字符串结尾---$
#1.转义符号
#在正则中本身具备特殊功能或者特殊意义符号的前面加'\',让他变成普通符号
print(fullmatch(r'\d\d\.\d\d','12.34')) #match='12.34'>
#2.【】也可以让独立存在有意义的符号功能消失
#+,*,?,^,$等
print(fullmatch(r'\d\d[.^$-+]\d\d','12+34'))
"""
fullmatch(正则,字符串)--完全匹配:判断整个字符串
match(正则,在字符串)--匹配字符串开头
search()---在整个字符串中查找第一个满足正则的子串
findall(正则,字符串)--获取整个字符串满足正则的子串,返回一个列表(注意分组问题)
finditer(正则)--获取整个字符串中所有满足正则的,返回一个迭代器,迭代器中的元素是匹配对象
sub(正则,字符串1,字符串2) 将字符串2中所有满足正则的子串全部替换成子串1
split(正则,字符串)
"""
能够完全匹配字符串"(010)-62661617"和字符串"01062661617"的正则表达式包括(ABD )
A.r"\(?\d{3}\)?-?\d{8}"
B. r"[0-9()-]+"
C.r"[0-9(-)]*\d*"
D.r"[(]?\d*[)-]*\d*"
能够完全匹配字符串"back"和"back-end"的正则表达式包括( A BCD)
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*'
能够完全匹配字符串"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'
能够在字符串中匹配"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 位范围内
str1=input('输入用户名')
result=fullmatch(r'\D\w{5,15}',str1)
print(result)
要求: 1.不能包含!@#¥%^&*这些特殊符号
2.必须以字母开头
3.⻓度在 6 到 12 位范围内
str2=input('输入密码')
result=fullmatch(r'([a-z]|[A-Z])[^!@#$%^&*]{5,11}',str2)
print(result)
ipv4='0.0.0.0'
result4=fullmatch(r'((\d|1\d\d|2[0-4][0-9])\.){3}(\d|1\d\d|2[0-4][0-9])',ipv4)
print(result4)
例如:“-3.14good87nice19bye” =====> -3.14 + 87 + 19 = 102.86
str='-3.14good87nice19bye'
num=findall(r'[\+\-]?\d+\.\d+|[\+\-]?\d+|0',str)
print(findall(r'[\+\-]?\d+\.\d+|[\+\-]?\d+|0',str))
sum1=0
for i in num:
sum1+=float(i)
print(i)
print(sum1)
#result=reduce(lambda x,item:x+float(item),nums,0)
验证输入内容只能是汉字
str3='验证输入内容只能是汉'
result5=fullmatch(r'[\u4e00-\u9fa5]+',str3)
print(result5)
匹配整数或者小数(包括正数和负数)
str6=‘90.9’
print(fullmatch(r’[±]?\d|[±]?[1-9]\d*.\d*|[±]?0.\d*’,str6))
7. 验证输入用户名和QQ号是否有效并给出对应的提示信息
```python
user='1_!full1match'
qq='12345'
print(fullmatch(r'\w{6,20}',user))
print(fullmatch(r'[1-9]\d{4,11}',qq))
拆分长字符串:将一首诗的中的每一句话分别取出来
poem = ‘窗前明月光,疑是地上霜。举头望明月,低头思故乡。’
def split_poem(poem):
return [x for x in split(r'[,。,.;:]',poem)if x]
poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
print(split_poem(poem))