Python之递归与正则

一.递归
# 在一个函数中调用自己
# 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)) # 用指定字符串替换正则匹配到的串

参考文档:

https://www.cnblogs.com/JayeHe/p/6656799.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值