day 15迈向大神之路 递归与正则表达式‘’‘’‘’‘

#递归

函数中调用自己

def re():
    print("1")
    re()
re()

最大递归深度为997/998 是python 从内存角度出发的

修改最大深度  import sys

set.setrecursionlimit(100000)

递归 占内存 优点 代码更简单

计算年龄

def age(n):
    if n==4:
        return 40
    elif n<4 and n>0 :
        return age(n-1)+2
age(2)

#### 查找和排序

二分查找:

def find(l,aim,start = 0,end = None):
    end = len(l) if end is None else end
    mid_index = (end - start)//2 + start
    if start <= end:
        if l[mid_index] < aim:
            return find(l,aim,start =mid_index+1,end=end)
        elif l[mid_index] > aim:
            return find(l, aim, start=start, end=mid_index-1)
        else:
            return mid_index
    else:
        return '找不到这个值'

ret= find(l,44)
print(ret)

阶乘

#
def jiecheng(n):
    if (n==1):re
        sum=1
    else:
        sum=jiecheng(n-1)*n
    return sum
print(jiecheng(4))

正则表达式

re模块

#####使用re模块来操作正则表达式 re是正则模块

#####定义 字符串匹配用的

import time

判断手机号(未用正则模块的)

while True:
    phone_number = input('please input your phone number : ')
    if len(phone_number) == 11 \
            and phone_number.isdigit()\
            and (phone_number.startswith('13') \
            or phone_number.startswith('14') \
            or phone_number.startswith('15') \
            or phone_number.startswith('18')):
        print('是合法的手机号码')
    else:
        print('不是合法的手机号码')

正则 匹配手机号

import re
phone_number = input('please input your phone number : ')
if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):    #正则规则
        print('是合法的手机号码')
else:
        print('不是合法的手机号码')

(匹配手机号)[http://tool.chinaz.com/regex]

[0123456789] #写在里面的内容都能被匹配到

[0-9]  - 转义   \-

[a-zA-Z]

[A-z]

元字符

。 匹配换行符以外的

\w  匹配字母或数字或下划线
\s  匹配任意空白符
\d 匹配数字 dight
\W   大写就是非

\n  匹配换行符
\t 匹配制表符
\b  匹配一个单词的结尾    egg    g\b
^ 匹配字符开始
$ 匹配字符结尾
[a|b]
分组()
[^a]  非

量词
* 重复零次或更多次   \d*    *多了0
+ 重复一次或更多次
? 重复0次 或一次
{n}  重复n次   \d{11}
{n,}重复n次或更多次
{n,m}重复n到m次    首先是规则  后是量词     可以与?  搭配

.茶+
eg
海.

李杰和李连杰和李二
[^和]+     加? 按照最少的来 [^和][2,3]?
李[^和]*
[\d]+
([abc][123])+  分组
身份证     ^[1-9]\d{13,16}[0-9x]$

 ^[1-9]\d{14}(\d{2}[0-9x])?$
或运算 (长的在前  )     ^([1-9]\d{16}[0-9x])|(\d[1-9]\d{14})$
注释取消
r'\n'

贪婪算法
<html> ...</html>
<.*>    从后找
<.*?>  非贪婪匹配
.*?x    遇到x停止

re模块 module

import re

#findall

import re
ret=re.findall('a','ewa egin yuan')
print(ret)   #['a', 'a']

ret=re.findall('[a-z]+','ewa egin yuan')
print(ret)   #['ewa', 'egin', 'yuan']
#返回所有满足匹配条件的结果,放到列表里

#search
import re
ret = re.search('a', 'eva egon yuan')
if ret:
    print(ret.group())
# 从前往后,找到一个就返回,返回的变量需要调用group才能拿到结果
# 如果没有找到,那么返回None,调用group会报错


#match
import  re
ret = re.match('[a-z]+', 'eva egon yuan')
if ret:
    print(ret.group())
# match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量。
# 匹配的内容需要用group才能显示
# re如果没匹配上,就返回None,调用group会报错


其他功能 
# ret = re.split('[ab]', 'abcd')
# # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
# print(ret)  # ['', '', 'cd']

# ret = re.sub('\d', 'H', 'eva3egon4yuan4',1)
#将数字替换成'H',参数1表示只替换1个
# print(ret) #evaHegon4yuan4

# ret = re.subn('\d', 'H', 'eva3egon4yuan4')
# #将数字替换成'H',返回元组(替换的结果,替换了多少次)
# print(ret)


# obj = re.compile('\d{3}')
# #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
# ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
# print(ret.group())
# ret = obj.search('abcashgjgsdghkash456eeee3wr2') #正则表达式对象调用search,参数为待匹配的字符串
# print(ret.group())  #结果 : 123




# import re
# ret = re.finditer('\d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
# print(ret)  # <callable_iterator object at 0x10195f940>
# # print(next(ret).group())  #查看第一个结果
# # print(next(ret).group())  #查看第二个结果
# # print([i.group() for i in ret])  #查看剩余的左右结果
# for i in ret:
#     print(i.group())




import re
# ret = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199912122277')
# print(ret.group())
# print(ret.group(1))   按组取
# print(ret.group(2))

#匹配网页   分组优先
# ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
# print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可    
#findall  没有分组机制   优化   ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')


#保留分组内容  
ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']




爬虫 豆瓣

import re
from urllib.request import urlopen

def getPage(url):
    response = urlopen(url)
    return response.read().decode('utf-8')

def parsePage(s):
    ret = re.findall(
        '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
       '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',s,re.S)
    return ret

def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    response_html = getPage(url)
    ret = parsePage(response_html)
    print(ret)

count = 0
for i in range(10):   # 10页
    main(count)
    count += 25

# url从网页上把代码搞下来
# bytes decode ——> utf-8 网页内容就是我的待匹配字符串
# ret = re.findall(正则,带匹配的字符串)  #ret是所有匹配到的内容组成的列表

#分组命名=?P<id>

##############################################################原始版

#http://www.coblogs.com/Eva-J/articles/7228075.html#_label10


import requests

import re
import json


def getPage(url):
    response = requests.get(url)
    return response.text


def parsePage(s):
    com = re.compile(
        '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>'
        '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)

    ret = com.finditer(s)
    for i in ret:
        yield {
            "id": i.group("id"),
            "title": i.group("title"),
            "rating_num": i.group("rating_num"),
            "comment_num": i.group("comment_num"),
        }


def main(num):
    url = 'https://movie.douban.com/top250?start=%s&filter=' % num
    response_html = getPage(url)
    ret = parsePage(response_html)
    print(ret)
    f = open("move_info7", "a", encoding="utf8")

    for obj in ret:
        print(obj)
        data = json.dumps(obj, ensure_ascii=False)
        f.write(data + "\n")


if __name__ == '__main__':
    count = 0
    for i in range(10):
        main(count)
        count += 25


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值