#递归
函数中调用自己
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