# #正则表达式
# #针对字符串进行数据筛选的表达式 (匹配)
# import re
# strr="张三李四王五赵六"
# pat="王五" #正则表达式# rst=re.search(pat,strr) #在strr字符串中找是否有符合pat表达式的值 re.search 扫描整个字符串并返回第一个成功的匹配。
# print(rst)
import re
#原子:正则表达式中实现匹配的基本单位
#元字符:正则表达式中具有特殊含义的字符
#以普通字符作为原子(匹配一个普通字符)
# a="湖南湖北广东广西"
# pat="湖北"
# result=re.search(pat,a)
# print(result)
#匹配通用字符
# \w 任意字母 数字 下划线
# \W 和小写w相反
# \d 十进制数字
# \D 除了十进制数以外的值
# \s 空白字符
# \S 非空白字符
# b="13293132521"
# pat2=r"1\d\d\d\d\d\d\d\d\d\d" #以1开头后面跟10个数字 手机号
# print(re.search(pat2,b))
# c="asdfdsf!@#$vdsav"
# pat3=r"\w\w\w"
# print(re.search(pat3,c))
#匹配数字,英文,中文
#数字[0-9]
#英文[a-z] [A-Z]
#中文[\u4e00-\u9fa5]
# d="!@#$%$$$张三$$$$#!!!!boy!@@@@@@@@@@@@########$!23!%!%!!%&^*%^$"
# pat1=r"[\u4e00-\u9fa5][\u4e00-\u9fa5]"
# pat2=r"[a-z][a-z]"
# pat3=r"[0-9][0-9]"
# result1=re.search(pat1,d)
# result2=re.search(pat2,d)
# result3=re.search(pat3,d)
# print(result1,result2,result3)
#原子表
#定义一组平等的原子
# b="13293132521"
# pat2=r"1[3456789]\d\d\d\d\d\d\d\d\d"
# print(re.search(pat2,b))
# c="dgrrheregepythondsfsdbdg"
# pat3=r"py[abcdt]hon" #原子表中每一个原子都是单独的字符,不能连接输出 例如,pytabhon就无法输出
# print(re.search(pat3,c))
#元字符---正则表达式中具有特殊含义的字符
# .匹配任意字符 \n除外
# ^匹配字符串开始位置 ^136 以136开头
# $匹配字符串中结束位置 6666$ 以6666结尾
# *重复0次1次多次前面的原子 /d*
# ?重复一次或者0次前面的原子
# +重复一次或者多次前面的原子
# d="132931316851329313252115226899762"
# pat1="..."
# pat2=r"^132\d\d\d\d\d\d\d\d"
# pat3=".*9762$"
# pat4="8*"
# pat5="8+"
# print(re.search(pat5,d))
#匹配固定次数
#{n}前面的原子出现了n次
#{n,}至少出现n次
#{n,m}出现次数介于n-m之间
# a="234654234sad5"
# pat1=r"\d{8,10}"
# print(re.search(pat1,a))
#多个表达式 | (或)连接
# 假如需要在网页中爬取手机号
# a="13293132521"
# b="027-1234567"
# pat1=r"13\d{9}|\d{3}-\d{7}"
# print(re.search(pat1,a))
#分组
# a="safhwuinv;pythonxajiwbfewimsadjiwjavaofhwef!@13293132521#$%^&*(&&!#$!$^*#"
# pat=r"(python).{0,}(java).{0,}(1[3578]\d{9})"
# print(re.search(pat,a).group(3))
#------------------------------------
# a="safhwuinv;pythonxajiwbfewimsadjiwjavaofhwef!@aaa13293132521bbb#$%^&*(&&!#$!$^*#"
# pat=r"aaa(.*?)bbb"
# print(re.findall(pat,a))
#贪婪模式和非贪婪模式
#贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配;
#非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配(?);
#Python中默认是贪婪的
# strr='aa<div>test1</div>bb<div>test2</div>cc'
# pat1=r"<div>.*</div>" #左边是<div>右边是</div> 中间是任意内容
# print(re.search(pat1,strr)) #贪婪模式 输出:'<div>test1</div>bb<div>test2</div>'
#------------------------------------------------------------
# strr='aa<div>test1</div>bb<div>test2</div>cc'
# pat1=r"<div>(.*?)</div>" #左边是<div>右边是</div> 中间是任意内容
# print(re.findall(pat1,strr)) #非贪婪模式 search(pat1,strr)输出:'<div>test1</div>'
# #findall(pat1,strr)输出:'test1', 'test2'
#compile函数---将正则表达式转换成内部格式,提高执行效率
# strr="python666Java"
# pat=re.compile(r"Python",re.I) #re.I模式修正符:忽略大小写
# print(pat.search(strr))
#match函数和search函数
#match函数--匹配开头
#search函数--匹配任意位置
#两个函数都是一次匹配,匹配到一次就不再往后匹配了
# strr="pythonjavahtmljs"
# pat=re.compile(r"java")
# print(pat.search(strr)) #search(strr)输出java match(strr)输出空
#findall() 查找所有匹配内容,装到列表中
#finditer() 查找所有匹配内容,装到迭代器中 for循环取出
# strr="hello------------hello-----------hello-----------hello------\
# --hello--------hello----------------hello----------hello---------------\
# -----hello---------hello--------hello------hello-----------hello---------\
# ----hello------hello------------------hello-------------"
# pat=re.compile(r"hello")
# #print(pat.findall(strr))
# data=pat.finditer(strr)
# list1=[]
# for i in data:
# list1.append(i.group())
# print(list1)
#split() 按照能够匹配的字符串将字符串分割后返回列表
#sub() 用于替换
strr1="张三,,,,,李四,,,,,,,,,,,王五,,赵六"
pat1=re.compile(r",+")
result1=pat1.split(strr1)
strr2="hello 123,hello 456!"
pat2=re.compile(r"\d+")
result2=pat2.sub("666",strr2)
print(result2)
Python自学记录(正则)
最新推荐文章于 2023-03-10 14:13:42 发布