一、findall与search方法
import re ret = re.findall('\d', '19621asd1695412rf') print(ret) ret1 = re.search('\d+r', '19621asd1695412rf') print(ret1) # 对象 if ret1: print(ret1.group())
# 分组现象 # findall 按照完整的正则进行匹配,但是显示括号里匹配到的内容 ret2 = re.findall('9(\d)\d', '19621asd1695412rf') print(ret2) ret3 = re.search('9(\d)(\d)', '19621asd1695412rf') print(ret3) # 对象 if ret3: print(ret3.group()) # 取第一个符合正则的内容 print(ret3.group(1)) # group(n)指定获得的第n个分组匹配到的内容 print(ret3.group(2)) # 为什么在search中不需要分组优先,而在findall中需要? # findall # 加上括号,是为了对真正需要的内容进行提取 s = '<h1>dasdsa930sadsa02391-</h1>' ret = re.findall('<.*?>(.*)</.*?>', s) print(ret[0]) # search ret = re.search('<.*?>(.*)</.*?>', s) print(ret.group(1)) # 为什么要用分组,以及findall的分组优先 s1 = '2-3*(5+6)' # 匹配出a+b 或者a-b 并计算它们的结果 ret = re.findall('(\d+)\+(\d+)', s1) print(ret) print(int(ret[0][0]) + int(ret[0][1])) # with open('movie_name.txt', encoding='utf-8') as f: #print(f.read()) content = f.read() r = re.findall('<span class="title">(.*?)</span>.*?</a>', content, flags=re.S) print(r) print(len(r)) # 如果我们要查找的内容在一个复杂的环境中 # 我们要查找的内容并没有一个突出的特点,甚至会和不需要的数据杂乱的混合在一起 # 这个时候我们就需要把所有的数据都统计出来,然后对这个数据进行筛选,把我们真正 # 需要的数据对应的正则表达式用()括起来 # 这样我们就可以拿到真正想要的数据啦 # 取消分组的优先级 ret = re.findall('1(?:\d)(\d)', '123') # 取消第一个分组的优先级 print(ret)
二、其他方法
import re # findall *** # search *** # # compile *** --节省代码时间的工具 # # 假如同一个正则表达式要被使用多次,就可以先解析该正则表达式并通过一个变量保存下来 # ret = re.compile('\d+') # print(ret.findall('s961gdx123fd')) # # # # finditer *** --节省空间 # ret = re.finditer('\d+', 's961gdx123fd') # 迭代器 # for i in ret: # print(i.group()) # 先 compile(如果没有重复使用同一个正则,也不能节省时间)后finditer ret = re.compile('\d+') res = ret.finditer('fd321df6fd46d11') for i in res: print(i.group()) # # match 默认从头开始匹配,一般用来规定该字符串必须是什么样的 # ret = re.match('\d+', '123eva456taibai') # print(ret.group()) # # split # ret = re.split('\d+', 'alex222wusir') # print(ret) # ret = re.split('\d(\d)\d', 'alex222wusir') # 保留括号内被切掉的内容 # print(ret) # # # # sub 替换 将正则匹配到的内容替换成别的内容 # ret = re.sub('\d+', 'H', 'alex123wusir456') # print(ret) # # # # subn # 也是替换,返回替换后的内容和替换的次数形成的元组 # ret = re.subn('\d+', 'H', 'alex123wusir456') # print(ret) # 功能 # 性能 # 时间: # 完成一个代码所需要执行的代码行数 # 执行代码的过程中,底层程序是如何工作的 # 空间 # 是占用了宝贵的内存资源 # 英雄程序的执行效率 # 用户体验
三、分组命名
# 分组命名:(?P<组名>正则) (?P=组名) import re ret = re.search('\d(\d)\d(?P<name1>\w+?)(\d)(?P<name2>\w)', '1231sd1_52432ghbr') print(ret.group('name1')) print(ret.group('name2')) # 分组命名的引用:**** exp = '<h1>sad654a6s4dv</h1><a>5621df</a>' ret = re.search('<(?P<n1>\w+)>(.*?)</(?P=n1)>', exp) print(ret.group()) print(ret.group(2)) # 方式二:不常用 # exp = '<h1>sad654a6s4dv</h1><a>5621df</a>' # ret = re.search(r'<(\w+)>(.*?)</\1>', exp) # print(ret.group()) # print(ret.group(2)) # r"" 取消字符串内部所有的转义 ret = re.search(r'\\n', r'\n') print(ret.group())