day9(正则与爬虫)

1.复习

超过最大递归限制的报错
只要写递归函数,必须要有结束条件。

返回值
不要只看到return就认为已经返回了。要看返回操作是在递归到第几层的时候发生的,然后返回给了谁。
如果不是返回给最外层函数,调用者就接收不到。
需要再分析,看如何把结果返回回来。

循环
递归


斐波那契  # 问第n个斐波那契数是多少
1,1,2,3,5,8   #fib(6) = fib(5) + fib(4)
def fib(n):
    if n == 1 or n==2:
        return 1
    return fib(n-1) + fib(n-2)
print(fib(50))

fib(6) = fib(5) + fib(4)
fib(5) = fib(4)+fib(3)
fib(4) = fib(3)+fib(2)
fib(3) = fib(2)+fib(1)
fib(2) = 1
fib(1) = 1
def fib(n,l = [0]):
    l[0] +=1
    if n ==1 or n == 2:
        l[0] -= 1
        return 1,1
    else:
        a,b = (n-1)
        l[0] -= 1
        if l[0] == 0:
            return a+b
        return b,a+b
print(fib(50))
def fib(n,a=1,b=1):
    if n==1 : return a
    return fib(n-1,b,a+b)
print(fib(5))

阶乘
    3! 3*2*1
    2! 2*1
    1! 1
def fac(n):
    if n == 1 :
        return 1
    return n * fac(n-1)
print(fac(100))

2.正则

计算器
re模块
正则表达式 —— 字符串匹配的
学习正则表达式
学习使用re模块来操作正则表达式
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('不是合法的手机号码')

print(r'\\n')
print(r'\n')

import re
findall
search
match

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

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

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

import re

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

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)  # ['www.oldboy.com']

ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

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

3.爬虫

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是所有匹配到的内容组成的列表

猜你喜欢

转载自blog.csdn.net/qq_36227329/article/details/81188581
今日推荐