-
split:以匹配的字符为截短(加上分组可以显示分组内容)
import re ret = re.split('d+','alex222wusir') print(ret) # 输出 ['alex', 'wusir'] ---------------------------------------- import re # 加上分组会显示分组的内容 ret = re.split('d(d)d', 'alex123wusir') print(ret) # 输出 ['alex', '2', 'wusir']
-
sub('匹配需要替换内容表达式','替换的新内容',替换次数):替换匹配到的内容
import re ret = re.sub('d+','HH','aa33bb44cc') print(ret) # 输出 aaHHbbHHcc -------------------------------------- import re ret = re.sub('d+','HH','aa33bb44cc',1) # 替换1次 print(ret) # 输出 aaHHbb44cc
-
subn:和sub一样,不过以元组的形式返回替换之后的的内容和替换的次数
import re ret = re.subn('d+','H','aa33bb44cc') print(ret) # 输出 ('aaHbbHcc', 2)
-
match:在表达式之前默认加了个 ^ 元字符(匹配以什么开头)
import re # 表达式相当于='^d+'匹配任意一个或多个数字开头的字符 ret = re.match('d+','1234abcd567') print(ret.group()) # 输出 1234
-
compile:节省代码时间的工具,没有重复使用同一个正则,也不能节省时间。
-
假如同一个正则表达式要被多次使用
-
节省了多次解析同一个正则表达式的时间
import re ret = re.compile('d+') res1 = ret.search('abcd1234') res2 = ret.findall('abcd1234') print(res1) print(res2) # 输出 <re.Match object; span=(4, 8), match='1234'> ['1234']
-
-
finditer:返回的是一个迭代器,为了节省空间
import re ret = re.finditer('d+','agks1ak018093') print(ret) # 是一个迭代器 for i in ret: # 把匹配出来的结果循环出来,节省了空间的占用 print(i.group()) # 输出 <callable_iterator object at 0x00000204E6721E20> 1 018093
二、分组命名
-
标准格式
(?P<组名>正则表达式)
-
有的时候我们要匹配的内容是包含在不想要的内容之中的
-
只能先把不想要的内容匹配出来,然后再想办法从结果中去掉
-
import re exp = '2014-9-23和1999-04-30' ret = re.search(r"[1-9]d{3}-(?P<month>[1][0-2]|0?[1-9])-(?P<date>[[1-2][0-9]|[3][01]|0?[1-9])", exp) print(ret.group()) print(ret.group('month')) print(ret.group('date')) # 输出 2014-9-23 9 23
三、递归函数
递归的最大深度是1000层:为了节省内存空间,不要让用户无限使用内存空间
count = 0 def func(): global count count += 1 print(count) func() func()
-
递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
-
循环和递归的关系
-
递归不是万能的
-
递归比起循环来说更占内存
-
-
修改递归的最大深度
import sys sys.setrecursionlimit(100000) # 修改递归深度,会根据电脑的性能来做适当的结束
一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件 并不是函数中有return,return的结果就一定能够在调用函数的外层接收到
函数的每层调用自己到为递,结束后的返回值为归
def func(count): count += 1 print(count) if count == 5 : return 5 # 结束递归的条件 ret = func(count) print(count ,':',ret) return ret # 在每次结束后把这次的返回值给上一层函数 print('-->',func(1)) # 输出 2 # 第一层未结束在调用自身 -->递 3 # 第二层未结束在调用自身 -->递 4 # 第三层未结束在调用自身 -->递 5 # 第四层条件满足,并把 5 返回给第三层并结束第四层的函数 -->归 4 : 5 # 第三层,并把返回的值返回给上一层函数并结束第三层函数, 5 为第四层函数的返回值 -->归 3 : 5 # 第二层,把第三层返回的值在返回给第一层并结束 -->归 2 : 5 # 第一层,获取第二层的返回值并返回给调用者 -->归 --> 5
四、递归函数练习
-
计算阶乘
def factorial(count): if count == 1: return count return factorial(count-1) * count
-
os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk
import os c = os.path.dirname(__file__) # 当前文件父目录 练习 def show_file(path): name_lst = os.listdir(path) for name in name_lst: abs_path = os.path.join(path, name) if os.path.isfile(abs_path): print(name) elif os.path.isdir(abs_path): show_file(abs_path) show_file(c)
-
计算斐波那契数列第10个数:1 1 2 3 5 8 13 21 34 55
def bonacci_sequence(count): if count == 1 or count ==2: return 1 else: return bonacci_sequence(count-1)+bonacci_sequence(count-2) print(bonacci_sequence(10)) # 输出 55
-
三级菜单 可能是n级
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } def threeLM(dic): while True: for k in dic: print(k) key = input('input>>').strip() if key == 'b' or key == 'q': return key elif key in dic.keys() and dic[key]: ret = threeLM(dic[key]) if ret == 'q': return 'q' threeLM(menu)