1.正则表达式
# 在线正则网站测试
# 鸡哥网站py基础-re模块-
'''
re模块与正则表达式之间的关系
正则表达式不是python独有的 它是一门独立的技术
全部的编程语言均可以使用正则
可是若是你想在python中使用,你就必须依赖于re模块python
正则就是用来筛选字符串中的特定的内容的正则表达式
书:正则指引编程
正则的应用场景
1.爬虫
2.数据分析编程语言
只要是reg...通常状况下都是跟正则有关测试
1.想匹配具体的内容 能够直接写完整的内容,不须要写正则 # 如 hello网站
'''对象
'''
注意事项blog
字符组 [] [a-z] [A-Z]
一个字符串里面的表达式都是或的关系
[A-Za-z] # A-Z或a-z字符串
字符
\s \d \w \W \D \S ^ $ \b . ()
^与$符连用 会精准限制匹配的内容 # ^tom$ 匹配一个tom就没有了
二者中间写什么 匹配的字符串就必须是什么
多一个也不想少一个也不行数据分析
abc|ab 必定要将长的放在前面 # 遵循前长后短
ab|abc # 这种错误的状况只会匹配ab
^ 直接写在外面 限制字符串的开头 # 用法一
[^] 除了[]写的字符 其余都要 # 用法二
#?用法一
正则在匹配的时候默认都是贪婪匹配(尽可能匹配多的)
你能够经过在量词后面加上一个?就能够将贪婪匹配变成非贪婪匹配(惰性匹配) # ?有两种用法
量词
* + ? {n} {n,} {n,m} # ?用法二
量词必须跟在正则符号的后面
量词只能可以限制紧挨着它的那一个正则符号 # 即只对前一个目标有效但可利用()让单体变群体
分组:当多个正则符号须要重复屡次的时候或者当作一个总体进行其余操做,那么能够分组的形式
分组在正则的语法中就是()
练习
身份证号码是一个长度为15或18个字符的字符串,若是是15位则所有🈶️数字组成,
首位不能为0;若是是18位,则前17位所有是数字,末位多是数字或x,
下面咱们尝试用正则来表示:
"""
2.re模块
import re
"""
findall
search
match
"""
# res = re.findall('[a-z]+','eva egon jason')
# # findall('正则表达式','带匹配的字符串')
# print(res)
# 找出字符串中符合正则表达式所有内容 而且返回的是一个列表,列表中的元素就是正则匹配到的结果
# res = re.search('a','eva egon jason')
# print(res) # search不会给你直接返回匹配到的结果 而是给你返回一个对象
# print(res.group()) # 必须调用group才能看到匹配到的结果
"""
注意:
1.search只会依据正则查一次 只要查到告终果 就不会再日后查找
2.当查找的结果不存在的状况下 调用group直接报错
"""
# res1 = re.search('a','eva egon jason')
# # search('正则表达式','带匹配的字符串')
# if res1:
# print(res1.group())
# res = re.match('a','eva egon jason')
# print(res)
# print(res.group())
"""
注意:
1.match只会匹配字符串的开头部分
2.当字符串的开头不符合匹配规则的状况下 返回的也是None 调用group也会报错
"""
# ret = re.split('[ab]', 'abcd') # 先按'a'分割获得''和'bcd',在对''和'bcd'分别按'b'分割
# print(ret) # ['', '', 'cd'] 返回的仍是列表
# ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) # 将数字替换成'H',参数1表示只替换1个
# # sub('正则表达式','新的内容','待替换的字符串',n)
# """
# 先按照正则表达式查找全部符合该表达式的内容 统一替换成'新的内容' 还能够经过n来控制替换的个数
# """
# print(ret) # evaHegon4yuan4
# ret = re.subn('\d', 'H', 'eva3egon4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
# ret1 = re.subn('\d', 'H', 'eva3egon4yuan4',1) # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
# print(ret) # 返回的是一个元组 元组的第二个元素表明的是替换的个数
# obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
# ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
# res1 = obj.findall('347982734729349827384')
# print(ret.group()) #结果 : 123
# print(res1) #结果 : ['347', '982', '734', '729', '349', '827', '384']
# import re
# ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
# print(ret) # <callable_iterator object at 0x10195f940>
# print(next(ret).group()) # 等价于ret.__next__()
# print(next(ret).group()) # 等价于ret.__next__()
# print(next(ret).group()) # 等价于ret.__next__()
# print(next(ret).group()) # 等价于ret.__next__()
# print(next(ret).group()) # 等价于ret.__next__()
# print(next(ret).group()) # 等价于ret.__next__() 查出迭代取值的范围 直接报错
# print(next(ret).group()) #查看第一个结果
# print(next(ret).group()) #查看第二个结果
# print([i.group() for i in ret]) #查看剩余的左右结果
import re
# res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
# 还能够给某一个正则表达式起别名
# res = re.search('^[1-9](?P<password>\d{14})(?P<username>\d{2}[0-9x])?$','110105199812067023')
# print(res.group())
# print(res.group('password'))
# print(res.group(1))
# print(res.group('username'))
# print(res.group(2))
# print(res.group(2))
# print(res.group(1))
# ret1 = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
# ret2 = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # 忽略分组优先的机制
# print(ret1,ret2) # ['oldboy'] 这是由于findall会优先把匹配结果组里内容返回,若是想要匹配结果,取消权限便可
# ret=re.split("\d+","eva3egon4yuan")# print(ret) #结果 : ['eva', 'egon', 'yuan']## ret1=re.split("(\d+)","eva3egon4yuan")# print(ret1) #结果 : ['eva', '3', 'egon', '4', 'yuan']