一.递归
# 在一个函数中调用自己
# count = 0
# def fun():
# global count
# count += 1
# print("第%s次调用自己" %(count))
# fun()
# fun() # ==> 输出到第998次,递归最大深度默认998或997
# 递归最大深度可修改
# import sys
# sys.setrecursionlimit(1500)
# count = 0
# def fun():
# global count
# count += 1
# print("第%s次调用自己" %(count))
# fun()
# fun()
# 输出到第1498次
# 斐波那契数列 1,1,2,3,5,8,13...
#f(n) = f(n-1) + f(n-2)
# def fun(n):
# if n == 1 or n == 2:
# return 1
# else:
# return fun(n-1) + fun(n-2)
#
# ret = fun(1)
# print(ret)
# ret = fun(2)
# print(ret)
# ret = fun(3)
# print(ret)
# ret = fun(4)
# print(ret)
# ret = fun(5)
# print(ret)
# ret = fun(6)
# print(ret)
# ret = fun(50) # 计算速度剧烈下降,递归在深度增加的同时,广度也在增加
# print(ret)
# 修改只朝深度方向走
# def fun(n):
# if n == 1 or n == 2:
# return 1,1
# else:
# a,b = fun(n-1)
# return b,a+b
#
# ret = fun(50)[1]
# print(ret)
-----------------------------------------------------------------------
二.正则
# re模块
'''
正则表达式的特殊字符
. 普通模式下,匹配除换行符外的任意一个字符,如果指定了模式(DOTALL标记),换行符也可以匹配
^ 匹配一个字符串的开始,在(多行模式)MULTLINE模式下,也匹配新行的开始
$ 匹配一个字符串的结束,在多行模式下,可以匹配任意一行的结束
正则表达式的数量符号
* 指定前面的字符出现0次或任意次,普通情况下贪婪匹配
+ 指定前面的字符出现1次或任意次
?指定前面的字符出现0次或1次
*? +? ?? 惰性匹配,匹配尽可能少的字符
{m,n} 指定字符出现m到n次,贪婪匹配,{,n} 0~n次;{m,} m~无限次
{m,n}? 惰性匹配,匹配尽可能少的字符
\ 转义,让特殊字符只代表本身的符号
[] 指定字符集合,集合内的所有特殊字符均为符号本省,且是或的关系例如:[acm.]匹配a,c,m,.四个符号中任意的一个或多个
[^] 标识取反,[^a]匹配不含有a的
| 或,从左到右匹配,如果匹配上了左边,则右边不再匹配,是惰性匹配
() 分组,组默认有编号,可以提取例如:abc(eee)dfg,匹配后可以使用\1提取匹配到的‘eee’
(?...) 表达式扩展符号,除?P之外;(?iLmsux),iLmsux可以任意一个或多个组合,要与re.I(忽略大小写),re.L(依赖locale),re.M(多行模式)
re.S(匹配所有字符),re.U(依赖Unicode),re.X(详细模式)
(?:...) 匹配内部的真则所匹配的内容,但是不分组
(?P<gname>) 分组,且自定义组名,默认是数字
(?#...) 注释,括号中的内容会忽略
(?=...) 前瞻断言,匹配指定字符后面跟着括号中的内容的字符串 -- abc(?=fff)匹配后面有fff的abc:abcfff能匹配
(?!...) 反前瞻断言,与上相反,匹配指定字符串后不跟括号中内容的字符串 -- abc(?!fff)匹配后面不是fff的abc:abcfff不能匹配
(?<=...) 后顾断言,匹配指定字符串前面有括号中内容的字符串 -- (?<=abc)def匹配前面是abc的def:abcdef可以匹配
(?<!...) 反后顾断言,与上相反,匹配指定字符串前面不包含括号中内容的串 -- (?<!abc)def匹配def前面不是abc的串:abcdef不能匹配
(?(id/name))yes-pattern|no-pattern) 如果由id或name指定的组存在的话。将会匹配yes-pattern,否则将会匹配no-pattern
通常情况下no-pattern可以省略,例如:(<)(\w+@\w+(?:\.\w+)+)(?(1)>)可以匹配
<user@host.com> 和 user@host.com
不能匹配<user@host.com
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白
\d 匹配数字
\b 匹配单词边界
'''
import re
# s1 = 'abc'
# s2 = '_bc'
# ret = re.match('.',s1) # . 匹配任意字符,re.match匹配字符串开头,返回一个对象,需要用goup取值
# print(ret.group())
# ret = re.match('.',s2) # . 匹配任意字符
# print(ret.group())
# s1 = 'foo1\nfoo2\nfoo3'
# ret = re.findall('foo.$',s1) # 匹配以foo+一个任意字符结束的串
# print(ret) # ==>['foo3'] 返回匹配到的串组成的列表
#
# s1 = 'foo1\nfoo2\nfoo3'
# ret = re.findall('foo.$',s1,re.MULTILINE) # 匹配以foo+一个任意字符结束的串,多行模式
# print(ret) # ==> ['foo1', 'foo2', 'foo3'] 返回匹配到的串组成的列表
#
# s1 = 'foo1\nfoo2\nfoo3'
# ret = re.findall('foo.$',s1,re.M) # 匹配以foo+一个任意字符结束的串,多行模式第二种写法
# print(ret) # ==> ['foo1', 'foo2', 'foo3'] 返回匹配到的串组成的列表
# s0 = 'ab'
# s1 = 'abc'
# s2 = 'abbc'
# s3 = 'abbbbbbbbbbbbbbbbbbbbc'
# ret = re.search('.b*.',s0) # 匹配前后各一个字符,中间可有含有b或不含b的串
# print(ret.group())
# ret = re.search('.b*.',s1) # 匹配前后各一个字符,中间可有含有b或不含b的串
# print(ret.group())
# # ret = re.search('.b+.',s0) # 匹配前后各一个字符,中间至少含有一个b的串--异常
# # print(ret.group())
# ret = re.search('.b?.',s0) # 匹配前后各一个字符,中间只有一个或没有b的串
# print(ret.group())
# ret = re.search('.b?.',s1) # 匹配前后各一个字符,中间只有一个或没有b的串
# print(ret.group())
# s1 = '<H1>title</H1>'
# ret = re.findall('<.*>',s1) # 贪婪匹配--匹配了最外层的<>
# print(ret) # ==> ['<H1>title</H1>']
# ret = re.findall('<.*?>',s1) # 惰性匹配--匹配了最少的<>,<>中间不再包含<>
# print(ret) # ==> ['<H1>', '</H1>']
# s1 = 'abbbbbc'
# s2 = 'abbbc'
# ret = re.findall('b{2,5}',s1) # 贪婪匹配,匹配多的b
# print(ret) # ==> ['bbbbb']
# ret = re.findall('b{2,5}?',s1) # 贪婪匹配,匹配多的b
# print(ret) # ==> ['bb', 'bb']
# ret = re.findall('b{3}',s1) # 贪婪匹配,匹配3个的b
# print(ret) # ==> ['bbb']
# s1 = 'acfegh'
# ret = re.findall('[abg]',s1) # 匹配字符a或b或g
# print(ret) # ==> ['a', 'g']
# ret = re.findall('[^abg]',s1) # 不匹配字符a或b或g
# print(ret) # ==> ['c', 'f', 'e', 'h']
# s1 = 'ab|abc|abcdef'
# ret = re.findall('ab|abc|abcdef',s1) # 匹配字符ab
# print(ret) # ==> ['ab', 'ab', 'ab']
# ret = re.findall('abc|abcdef',s1) # 匹配字符abc
# print(ret) # ==> ['abc', 'abc']
# s1 = 'hello,every one'
# ret = re.search('.*(every).*',s1) # 将every分组为1
# print(ret.group()) # ==> hello,every one
# print(ret.group(1)) # ==> every
# s1 = 'foo1\nfoo2\nfoo3\n'
# ret = re.findall('(?m)(foo.$)',s1) # 多行模式第三种写法
# print(ret) # ==> ['foo1', 'foo2', 'foo3']
# s1 = 'foo1\nfoo2\nfoo3\n'
# ret = re.findall('.*',s1) # 匹配不了换行符
# print(ret) # ==> ['foo1', '', 'foo2', '', 'foo3', '', '']
#
# ret = re.findall('.*',s1,re.S) # 可以匹配换行符
# print(ret) # ==> ['foo1\nfoo2\nfoo3\n', '']
#
# ret = re.findall('(?s)(.*)',s1) # 匹配换行符的第二种写法
# print(ret) # ==> ['foo1\nfoo2\nfoo3\n', '']
# s1 = 'today is a good day'
# ret = re.findall('.*(?P<g1>good).*',s1)
# print(ret)
# ret = re.search('.*(?P<g1>good).*',s1) # 分组名为g1
# print(ret.group()) # ==> today is a good day
# print(ret.group('g1')) # ==> good 通过g1组名取值
# s1 = 'today is a good day'
# s2 = 'yestoday is a nice day'
# ret = re.findall('good (?=day).*',s1) # 前瞻断言'good '后面有day的串
# print(ret) # ==> ['good day']
# ret = re.findall('good (?=day).*',s2)
# print(ret) # ==> []
# s1 = 'today is a good day'
# s2 = 'yestoday is a nice day'
# ret = re.findall('a (?!good).*',s1) # 反前瞻断言'a '后面不是good的串
# print(ret) # ==> []
# ret = re.findall('a (?!=good).*',s2)
# print(ret) # ==> ['a nice day']
# s1 = 'today is a good day'
# s2 = 'yestoday is a nice day'
# ret = re.findall('.*(?<=good) day',s1) # 后顾断言' day'前面是good的串
# print(ret) # ==> ['today is a good day']
# ret = re.findall('.*(?<=good) day',s2)
# print(ret) # ==> []
# s1 = 'today is a good day'
# s2 = 'yestoday is a nice day'
# ret = re.findall('.*(?<!good) day',s1) # 反后顾断言' day'前面不是good的串
# print(ret) # ==> []
# ret = re.findall('.*(?<!good) day',s2)
# print(ret) # ==> ['yestoday is a nice day']
'''
(?(id/name))yes-pattern|no-pattern) 如果由id或name指定的组存在的话。将会匹配yes-pattern,否则将会匹配no-pattern
通常情况下no-pattern可以省略,例如:(<)(\w+@\w+(?:\.\w+)+)(?(1)>)可以匹配
<user@host.com> 和 user@host.com
不能匹配<user@host.com
'''
s1 = '<user1@host.com>'
s2 = 'user2@host.com.cn'
s3 = '<user3@host.com'
ret = re.search('(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)',s1)
print(ret.group()) # ==> <user1@host.com>
ret = re.search('(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)',s2)
print(ret.group()) # ==> user2@host.com.cn
ret = re.search('(<)(\w+@\w+(?:\.\w+)+)(?(1)>)',s3)
print(ret.group()) # ==> 异常
# re.compile('正则','模式') # 模式:re.M,re.S...
# s1 = 'today is a good day'
# print(re.split('ay',s1)) # 以ay为分割符,切割字符串,增则不可为空
# s1 = 'today is a good day'
# print(re.sub('g.*?d','GOOD',s1)) # 用指定字符串替换正则匹配到的串
参考文档: