# -*- coding: utf-8 -*-
import requests
import time as st
import functools
import re
'''编写测时装饰器'''
def measure_time(func):
@functools.wraps(func)
def measure(*args, **kwargs):
starttime = st.time()
result = func(*args, **kwargs)
endtime = st.time()
print("function %s consume %ds" % (func.__name__, endtime-starttime))
return result
return measure
'''递归思想与数学归纳法'''
#汉诺塔问题
@measure_time
def move(dish, begin, stop, destination):
if dish == 1:
print("move dish from %s to %s" % (begin, destination))
else:
move(dish-1, begin, destination, stop)
print("move dish from %s to %s" % (begin, destination))
move(dish-1, stop, begin, destination)
#归并排序问题
@measure_time
def split(in_list):
if len(in_list) <= 1:
return in_list
mid = len(in_list) // 2 #python3使用// python2使用/
left = split(in_list[:mid])
right = split(in_list[mid:])
#return merge(left, right)
return merge(left, right)
def merge(left, right):
result = []
i = 0
j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
if __name__ == "__main__":
move(3, 'A', 'B', 'C')
#对字典切片
in_dict = {1:'1',2:'2',3:'3',4:'4',5:'5',6:'6',7:'7'}
#通过value返回keys
print(list(in_dict.keys())[list(in_dict.values()).index("7")])
#print(split([10, 67,19,9,8,7,6,1,2,5,4,3]))
'''python中正则表达式的使用进阶'''
'''以检索80图书馆网站,网址字符串为例'''
'''扩展正则表达式的用法'''
url = r'https://www.80xs.la/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
html = requests.get(url, headers=headers)
print(html.text)
#无预搜索的正则表达式
pattern = re.compile(r'<li><a href=.*>.*<\/li>')
#使用预搜索的正则表达式,相当于if, 主要用于提取字符串中的指定字符
#(?=...) 要是一个字符串后面是...,开始匹配这个字符串,翻译成自然语言:假设字符串之后是...则匹配
#(?!...) 要是一个字符串后面不是...,开始匹配这个字符串,翻译成自然语言:假设字符串之后不是...则匹配
#(?<=...) 要是一个字符串前面是...,开始匹配这个字符串, 翻译成自然语言:假设字符串之前是...则匹配
#(?<!...) 要是一个字符串前面不是...,开始匹配这个字符串, 翻译成自然语言:假设字符串之前不是...则匹配
'''正常re模块中的findall函数中使用(com|cn),findall函数默认会将可捕获分组以tuple数据类型输出,由于()()会创建一个分组,则输出会把com或者cn单独输出'''
#使用(?:...) 与() 都是分组,()是捕获分组,值会被保存下来,使用$n取值.(?:...)是非捕获分组,值不会被保存下来
patternnet = re.compile(r'(?<=<li><a href=")(?:https?:\/\/www\.\w+\.)(?:com|cn|la)(?:\/)(?:\/.*\/.*\.html)?')
patternyu = re.compile(r'(?:https?:\/\/www\.\w+\.)(?:com|cn|la)(?:\/)(?=<\/a>)(?:.*\/.*\/.*.html)?')
#(?P<name>...)用于为group分组命名(?(name)Y|N) 若找到name命名的分组,则执行Y,否则执行N
patternpy = re.compile(r'(?P<dnode><li><a href=")(?(dnode)(?:(?:[https]{4,5}:\/\/www\.\w+\.))(?:com|cn|la)(?:\/))(?:\/.*\/.*.html)?')
matcher = re.findall(patternyu, html.text)
for i in matcher:
print(i)