目录
一、名字的查找顺序
1、方法
1. 先从内存中查找
2. 再从内置模块中查找
3. 最后去环境变量sys.path中查找如果以上都找不到,直接报错!
注:给文件名或者叫模块名起名字的时候一定不能跟内置模块名冲突!
import sys
print(sys.path)
['D:\\Python27\\day20', 'D:\\Python27\\day20', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'C:\\Users\\oldboy\\AppData\\Roaming\\Python\\Python38\\site-packages', 'D:\\Python38\\lib\\site-packages', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
上面的列表中第一个元素永远是当前文件所在的路径,第二个是项目的路径。
2、遇到模块找不到的情况
(1).把模块所在的路径添加到sys.path中
import sys
sys.path.append(r'D:\Python27\day20\aaa\bbb')
(2).使用from...import句式
from aaa.bbb.ccc import m1
from aaa.bbb.ccc.m1 import f1
f1()
m1.f1()
二、绝对导入和相对导入
在导入模块的时候,模块的查找始终以执行文件所在的路径为准。
1、绝对导入
它始终是以执行文件所在的sys.path路径为基准查找
2、相对导入
.(句点符)
. 代表的是当前路径
.. 代表的是上一级路径
注:
相对导入可以打破始终以执行文件及准的查找顺序
只要py文件中出现了相对导入语句(.开头的语句),那么,这个文件就不能当成执行文件了,只能被导入。
from .ccc import m2
from .ccc.ddd import m2
三、包的使用
1、什么是包
包其实就是文件夹中包含了一些列的py文件(模块),即包就是一些列模块的组合。
2、包和模块有什么区别
包中有一个特殊文件:__init__.py文件
导包其实就是在导包下的__init__.py文件的!
后续我们可能会在项目中封装出各种各样的包,一个包一般情况就是一个答得功能,而且包中使用的代码、路径等都不相互依赖。
四、软件开发目录规范
1、定义
为了提高程序的可读性与可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可。简单来说,软件开发目录规范就是跟项目中的文件夹起合适的名字。
2、目录结构
(1).bin:放启动文件的
eg:run.py start.py manage.py...
如果你的启动文件只有一个,也可以不要bin文件夹,可以把启动文件写在项目的根下。
(2).conf/ (config:配置)
settings.py
就是一些初始化的数据。
(3).core/(核心)
写一些项目的核心逻辑。
src.py
def login():
pass
def register():
pass
(4).lib/ (library:库)
这个里面一般写项目使用的公共代码。
common.py
def outer():
pass
(5).log:日志
日志:就是记录一些在代码运行过程中发生的一些事情,可以是正确的,可以是异常的。
(6).db/(database)
跟项目相关的数据存储都存在db(data)。
(7).api/
存放接口文件,接口主要用于为业务逻辑提供数据操作。
当你自定义文件夹名字的时候,一定要是见名知意, 一定不能出现中文的。
(8).run.py
程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤。
(9).setup.py
安装、部署、打包的脚本
(10).requirements.txt
存放软件依赖的外部Python包列表
(11).README
就是项目的说明书
五、正则表达式
定义
正则表达式:利用一些特殊的符号匹配出我们想要的数据。
正则表达式它是一门独立的语言,跟Python、Java等语言没有关系的。所以,如果想在Python中使用正则表达式,需要借助于re模块(import re)。
我们只学习正则的基础,就学习一些简单的正则够我们开发使用就行了。
# 判断手机号是否合法
# 1. 手机号需要是纯数字
# 2. 手机号必须是11位
# 3. 必须是13、15、16、18等开头
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('不是合法的手机号码')
1、字符组
字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。
正则 | 待匹配字符 | 匹配 结果 | 说明 |
[0123456789] | 8 | True | 在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配 |
[0123456789] | a | False | 由于字符组中没有"a"字符,所以不能匹配 |
[0-9] | 7 | True | 也可以用-表示范围,[0-9]就和[0123456789]是一个意思 |
[a-z] | s | True | 同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示 |
[A-Z] | B | True | [A-Z]就表示所有的大写字母 |
[0-9a-fA-F] | e | True | 可以匹配数字,大小写形式的a~f,用来验证十六进制字符 |
2、字符
元字符 | 匹配内容 |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\b | 匹配一个单词的结尾 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
\W | 匹配非字母或数字或下划线 |
\D | 匹配非数字 |
\S | 匹配非空白符 |
a|b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
3、量词
1. 量词只能够影响前面一个字符(ab+ 影响b)
2. 量词不能够单独使用,必须配合表达式使用
量词 | 用法说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
4、贪婪匹配
贪婪匹配:贪婪匹配就是把匹配的内容尽量多的匹配!
正则 | 待匹配字符 | 匹配 | 说明 |
<.*> | <script>...<script> | <script>...<script> | 默认为贪婪匹配模式,会匹配尽量长的字符串 |
<.*?> | r'\d' | <script> | 加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串 |
取消贪婪匹配
<.*?>
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。
合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
.*?x
就是取前面任意长度的字符,直到一个x出现
练习
1. 手机号正则 : /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/
2. 身份证的正则:"^[1-9]\\d{5}(19\\d{2})|(20[01]\\d)|(202[012])(((0[13578])|10|12)((0[1-9])|(([12][0-9])|30|31)))|(((0[469])|11)((0[1-9])|(([12][0-9])|30)))|(02((0[1-9])|([12][0-9])))//d{4}"
3. 邮箱的正则:^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
...
对于常见的正则表达式,我们直接取百度搜索,实际编码中,我们可以写一些简单的正则。
5、转义符 \
在原生正则中,取消转义字符只需要加\(一个\只能转一个字符),在Python中,推荐使用r'\n\t\d'(取消转义)
正则 | 待匹配字符 | 匹配 | 说明 |
\n | \n | False | 因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配 |
\\n | \n | True | 转义\之后变成\\,即可匹配 |
"\\\\n" | '\\n' | True | 如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次 |
r'\\n' | r'\n' | True | 在字符串之前加r,让整个字符串不转义 |
6、re模块下的常用方法
在Python中,如果使用正则,需要借助于模块,re模块
regluar express -------------> re
import re
ret = ret = re.findall('正则', '待匹配内容') # 返回所有满足匹配条件的结果,放在列表里
"""待匹配内容一定是一个字符串,文本. []"""
ret = re.findall('ab', 'eva egon yuan a')
# 返回所有满足匹配条件的结果,放在列表里
"""如果匹配到内容就把数据以列表的形式返回, 如果匹配不到就返回[]"""
print(ret) # []
ret = re.search('a', 'eva egon yuan').group()
print(ret) # 结果 : 'a'
# 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
if ret:
print(ret.group())
else:
print(ret)
try:
ret = re.search('a', 'eva egon yuan').group()
print(ret)
except Exception:
print(ret)
ret = re.match('a', 'ewqeqwabc').group() # 同search,不过尽在字符串开始处进行匹配
print(ret)
# 结果 : 'a'
try:
ret = re.match('a', 'ewqeqwabc').group()
print(ret)
except Exception:
print(ret)
7、分组
(1)、无名分组
使用小括号括起来的正则表达式就是无名分组
import re
res = re.search('^([1-9])(\d{14})(\d{2}[0-9x]?)$', '110105199812067023')
print(res) # <re.Match object; span=(0, 18), match='110105199812067023'>
print(res.group()) # 110105199812067023
print(res.group(2)) # 10105199812067
print(res.group(3)) # 023
"""
如果是findall,分组优先展示,无名分组
"""
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x]?$)", '110105199812067023')
print(res) # ['023']
(2)、有名分组
使用小括号括起来的正则表达式然后给起个名字就是有名的
import re
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$', '110105199812067023')
print(res) # <re.Match object; span=(0, 18), match='110105199812067023'>
print(res.group(1)) # 10105199812067
print(res.group(2)) # 023
print(res.group('xxx')) # 10105199812067
print(res.group('ooo')) # 023
(3)、案例
爬取红牛分公司官网数据
with open('a.txt', 'r', encoding='utf-8') as f:
data = f.read()
import re
title_list = re.findall('<h2>(.*?)</h2>', data)
address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
res_list = zip(title_list, address_list, email_list, phone_list)
# print(list(res_list))
for i in list(res_list):
print("""
公司名称:%s,
公司地址:%s,
公司邮编:%s,
公司电话:%s,
""" % (i[0], i[1], i[2], i[3]))
运行结果
公司名称:红牛杭州分公司,
公司地址:杭州市上城区庆春路29号远洋大厦11楼A座,
公司邮编:310009,
公司电话:0571-87045279/7792,
公司名称:红牛广西分公司,
公司地址:南宁市金湖路59号地王国际商会中心50层D1、E1室,
公司邮编:530021,
公司电话:0771-5592660/61/62,
公司名称:红牛广州分公司,
公司地址:广东省广州市天河珠江新城华夏路10号富力中心写字楼1904房,
公司邮编:510623,
公司电话:020-38927681,
公司名称:红牛深圳分公司,
公司地址:广东省深圳市福田区福华三路88号财富大厦39楼BCD,
公司邮编:518048,
公司电话:0755-23962001,
公司名称:红牛湖南分公司,
公司地址:湖南省长沙市天心区劳动西路289号嘉盛国际广场1626室,
公司邮编:410015,
公司电话:0731-88708080/8081,
公司名称:红牛福建分公司,
公司地址:福建省福州市台江区广达路68号金源广场东区15楼BC,
公司邮编:350005,
公司电话:0591-83362015,
公司名称:红牛东莞分公司,
公司地址:东莞市南城区石竹路3号广发金融大厦10楼01室,
公司邮编:523071,
公司电话:0769-23184981,
公司名称:红牛四川分公司,
公司地址:四川省成都市武侯区人民南路4段27号商鼎国际1栋1单元1201室,
公司邮编:610041,
公司电话:028-85226292,
公司名称:红牛湖北分公司,
公司地址:武汉市东西湖区金银湖路18号财富大厦13楼,
公司邮编:430048,
公司电话:027-63370775/63370772,
公司名称:红牛云南分公司,
公司地址:云南省昆明市青年路389号志远大厦13楼A-2号,
公司邮编:650021,
公司电话:0871-3100721,
公司名称:红牛贵州分公司,
公司地址:贵阳市云岩区北京路27号鑫都财富大厦26楼A座,
公司邮编:550004,
公司电话:0851—6814108,
公司名称:红牛湛江分公司,
公司地址:湛江市霞山区人民大道南45号民大商贸大厦1103,
公司邮编:524000,
公司电话:0759-2837830/2837860,
公司名称:红牛南疆分公司,
公司地址:新疆库尔勒市滨河路天赐花园B座2302室,
公司邮编:841000,
公司电话:0996-2106316,
公司名称:红牛江西分公司,
公司地址:江西省南昌市广场南路333号恒茂国际中心A座805室,
公司邮编:330002,
公司电话:0791-86497863/86665007,
公司名称:红牛南京分公司,
公司地址:江苏省南京市鼓楼区山西路8号金山大厦A座19楼1901室,
公司邮编:210009,
公司电话:025-83223948,
公司名称:红牛北京分公司,
公司地址:北京市建国门外大街永安东里华彬国际大厦10层1007,
公司邮编:100022,
公司电话:010-85288029-8010,
公司名称:红牛辽宁分公司,
公司地址:沈阳市和平区和平北大街69号总统大厦C座2206,
公司邮编:110001,
公司电话:024-23267261/62/63,
公司名称:红牛陕西分公司,
公司地址:陕西省西安市锦业路1号都市之门C座11508室,
公司邮编:710065,
公司电话:029-88816813,
公司名称:红牛苏北分公司,
公司地址:盐城市盐都区华邦国际西厦A区2006、2007,
公司邮编:224000,
公司电话:0515-88582102,
公司名称:红牛汕头分公司,
公司地址:广东省汕头市华山路碧霞庄中区1幢(民生银行大厦)407-408室,
公司邮编:515041,
公司电话:0754-88695688,
公司名称:红牛重庆分公司,
公司地址:重庆市渝中区华盛路1号企业天地8号楼第20层6+7单元,
公司邮编:400015,
公司电话:023-89031120/21,
公司名称:红牛上海分公司,
公司地址:上海市虹口区武进路360号壹丰广场1506室,
公司邮编:200080,
公司电话:021-61178178,
公司名称:红牛新疆分公司,
公司地址:新疆乌鲁木齐市北京南路439号中核发展大厦16楼,
公司邮编:830011,
公司电话:0991-4835894,
公司名称:红牛安徽分公司,
公司地址:安徽省合肥市肥西路66号汇金大厦12B楼1203-1205室,
公司邮编:230001,
公司电话:0551-2657611,
公司名称:红牛黑龙江分公司,
公司地址:黑龙江省哈尔滨市南岗区东大直街146号上和置和广场1号楼27层2711室,
公司邮编:150001,
公司电话:0451-53608457,
公司名称:红牛河南分公司,
公司地址:河南省郑州市中州大道1188号建业置地广场B座27层155号,
公司邮编:450000,
公司电话:0371-65786101,
公司名称:红牛山东分公司,
公司地址:山东省济南市经十路13777号中润世纪城5号楼902室,
公司邮编:250014,
公司电话:0531-88558011,
公司名称:红牛甘肃分公司,
公司地址:兰州市庆阳路105号澳兰名门B1座6楼,
公司邮编:730000,
公司电话:0931-8279900/0931-8276600 ,
公司名称:红牛海南分公司,
公司地址:海南省海口市国贸大道2号海南时代广场10楼10D单元,
公司邮编:570125,
公司电话:0898-68554263,
公司名称:红牛青岛分公司,
公司地址:山东省青岛市市北区延吉路76号中海大厦6号楼903室,
公司邮编:266000,
公司电话:0532-66990781,
公司名称:红牛天津分公司,
公司地址:天津市河西区越秀路38号银河大厦1004室,
公司邮编:300201,
公司电话:022-58376301/02,
公司名称:红牛豫南分公司,
公司地址:驻马店市乐山路与通达路交叉口爱家会展国际公寓5B1105,
公司邮编:463000,
公司电话:0396-3336611,
公司名称:红牛山西分公司,
公司地址:太原市杏花岭区肖墙路9号御花园假日广场写字楼B座11层8-16号,
公司邮编:030002,
公司电话:0351-3343385,
公司名称:红牛吉林分公司,
公司地址:吉林省长春市朝阳区人民大街4111号兆丰国际大厦402室,
公司邮编:130000,
公司电话:0431-88658765/89819146/88405122,
公司名称:红牛内蒙分公司,
公司地址:呼和浩特市赛罕区呼伦南路119号东达城市广场写字楼2307室,
公司邮编:010020,
公司电话:0471-5254961/62/63,
公司名称:红牛河北分公司,
公司地址:河北省石家庄市建设南大街6号西美大厦1102室,
公司邮编:500000,
公司电话:0311-86966921,
公司名称:红牛青海分公司,
公司地址:青海省西宁市城中区西大街10号浩运大厦7楼703室,
公司邮编:810000,
公司电话:0971-8276755,
公司名称:红牛宁夏分公司,
公司地址:银川市金凤区北京中路51号瑞银财富中心C座11楼,
公司邮编:750001,
公司电话:0951-6890560,
公司名称:红牛浙南代表处,
公司地址:温州市车站大道2号华盟商务广场1706-1707室,
公司邮编:325000,
公司电话:0577-88557337,
公司名称:红牛金丽衢代表处,
公司地址:金华市八一北街739号东方国际财富双塔西塔24楼F室,
公司邮编:321000,
公司电话:0579-82515088,