python模块--re模块
import re # ret = re.findall('\d+','19740ash93010uru') # print(ret) # # ret = re.search('\d+','19740ash93010uru') # print(ret) # 变量 # if ret: # print(ret.group()) # 预习一个现象并且找到答案 - 分组有关系() # findall 还是按照完整的正则进行匹配,只是显示括号里匹配到的内容 # ret = re.findall('9\d\d','19740ash93010uru') # print(ret) # search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数 # 来获取具体文组中的内容 # ret = re.search('9(\d)(\d)','19740ash93010uru') # print(ret) # 变量 # if ret: # print(ret.group()) # print(ret.group(1)) # print(ret.group(2)) # findall # 取所有符合条件的,优先显示分组中的 # search 只取第一个符合条件的,没有优先显示这件事儿 # 得到的结果是一个变量 # 变量.group() 的结果 完全和 变量.group(0)的结果一致 # 变量.group(n) 的形式来指定获取第n个分组中匹配到的内容 # 为什么在search中不需要分组优先 而在findall中需要? # 加上括号 是为了对真正需要的内容进行提取 # ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>') # print(ret) # search # ret = re.search('<(\w+)>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>') # print(ret.group()) # print(ret.group(1)) # print(ret.group(2)) # 为什么要用分组,以及findall的分组优先到底有什么好处 exp = '2-3*(5+6)' # a+b 或者是a-b 并且计算他们的结果 # ret = re.search('\d+[+]\d+',exp) # print(ret) # a,b = ret.split('+') # print(int(a)+int(b)) # ret = re.search('(\d+)[+](\d+)',exp) # print(ret) # print(ret.group(1)) # print(ret.group(2)) # print(int(ret.group(1)) + int(ret.group(2))) # with open('douban.html',encoding='utf-8') as f: # content = f.read() # ret = re.findall('<span class="title">(.*?)</span>(?:\s*<span class="title">.*?</span>)?',content) # print(ret) # 如果我们要查找的内容在一个复杂的环境中 # 我们要查的内容并没有一个突出的 与众不同的特点 甚至会和不需要的杂乱的数据混合在一起 # 这个时候我们就需要把所有的数据都统计出来,然后对这个数据进行筛选,把我们真正需要的数据对应的正则表达式用()圈起来 # 这样我们就可以筛选出真正需要的数据了 # 什么是爬虫 # 通过代码获取到一个网页的源码 # 要的是源码中嵌着的网页上的内容 -- 正则表达式 # import requests # ret = requests.get('https://movie.douban.com/top250?start=0&filter=') # print(ret.content.decode('utf-8')) # 分组和findall的现象 # 为什么要用分组? # 把想要的内容放分组里 # 如何取消分组优先 # 如果在写正则的时候由于不得已的原因 导致不要的内容也得写在分组里 # (?:) 取消这个分组的优先显示
# findall # search import re # split # ret = re.split('\d+','alex222wusir') # ret = re.split('\d(\d)\d','alex123wusir') # print(ret) # sub 替换 # ret = re.sub('\d+','H','alex123wusir456',1) # print(ret) # subn # ret = re.subn('\d+','H','alex123wusir456') # print(ret) # match 用户输入的内容匹配的时候,要求用户输入11位手机号码,^手机号正则$ # match('手机号正则$','123eva456taibai') 规定这个字符号必须是什么样的 # search('^手机号正则$','123eva456taibai') 用来寻找这个字符串中是不是含有满足条件的子内容 # ret = re.match('\d+','123eva456taibai') # print(ret.group()) # ret = re.search('^\d+','123eva456taibai') # print(ret.group()) # compile -- 节省代码时间的工具 # 假如同一个正则表达式要被使用多次 # 节省了多次解析同一个正则表达式的时间 # ret = re.compile('\d+') # res1 = ret.search('alex37176') # res2 = ret.findall('alex37176') # print(res1) # print(res2) # finditer -- 节省空间 # ret = re.finditer('\d+','agks1ak018093') # for i in ret: # print(i.group()) # 先compile(如果没有重复使用同一个正则,也不能节省时间) # 再finditer # ret= re.compile('\d+') # res = ret.finditer('agks1ak018as093') # for r in res: # print(r.group()) # 列表不能用insert # 列表不能用pop(n) # 功能 # 性能 # 时间 : # 你要完成一个代码所需要执行的代码行数 # 你在执行代码的过程中,底层程序是如何工作的 # 空间 # 是占用了宝贵的内存条资源 # 影响程序的执行效率 # 用户体验
# 分组命名 # import re # ret = re.search('\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(?P<name1>\w+?)(\d)(\w)\d(\d)\d(?P<name2>\w+?)(\d)(\w)', # '123abc45678agsf_123abc45678agsf123abc45678agsf') # # print(ret.group('name1')) # print(ret.group('name2')) # (?P<名字>正则表达式) # ret.group('名字') # 分组命名的引用 # import re # exp= '<abc>akd7008&(&*)hgdwuih</abb>008&(&*)hgdwuih</abd>' # ret= re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',exp) # print(ret) import re # exp= '<abc>akd7008&(&*)hgdwuih</abc>008&(&*)hgdwuih</abd>' # ret= re.search(r'<(\w+)>.*?</\1>',exp) # ret= re.search('<(\w+)>.*?</\\1>',exp) # print(ret) import re # ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))") # print(ret) # ret = ['1', '2', '60', '', '5', '4', '3','',''] # ret.remove('') # print(ret) # ret = filter(lambda n:n,ret) # print(list(ret)) # 分组命名(?P<组名>正则) (?P=组名) # 有的时候我们要匹配的内容是包含在不想要的内容之中的, # 只能先把不想要的内容匹配出来,然后再想办法从结果中去掉