一、栈和队列
1.栈
抽象成一个开口向上的容器【羽毛球球筒】
在列表一端进行操作(添加,删除)。
- 特点:先进后出
#创建一个栈【列表】
my_stack = []
#入栈【向栈中存数据】:append
my_stack.append(23)
print(my_stack)
my_stack.append(30)
print(my_stack)
my_stack.append(4)
print(my_stack)
#出栈【从栈中取数据】:pop
#pop每调用一次,则取出一个数据,先添加进去的最后被取出来【先进后出】
my_stack.pop()
print(my_stack)
my_stack.pop()
print(my_stack)
my_stack.pop()
print(my_stack)
2.队列
queue抽象成一个水平放置的水管
- 特点:先进先出
import collections
#创建队列
queue = collections.deque([12,43,8,10])
print(queue)
#入队【存数据】,append
queue.append(66)
print(queue)
queue.append(77)
print(queue)
#deque([12, 43, 8, 10, 66, 77])
#出队【取数据】,popleft
queue.popleft()
print(queue)
queue.popleft()
print(queue)
queue.popleft()
print(queue)
二、文件和目录
1. os模块
需要引入os模块
1.1 os基本方法
函数名 | 函数值 |
---|---|
os.name | 获取当前的操作系统的类型nt->windows posix->unix 后者Linux |
os.environ | 获取操作系统中的环境变量 |
os.environ.get(“path”) | 获取path的环境变量 |
os.curdir | 获取当前的目录 |
os.getcwd() | 获取当前的工作目录 |
**os.listdir() **** | 以列表的形式 返回当前目录的文件 |
os.mkdir() | 创建目录 |
os.rmdir() | 删除目录 |
os.rename(old,new) | 修改文件后者文件夹的名字 |
os.remove() | 删除文件 |
os.system(command) | 执行系统命令 |
**os.walk(path) **** | 遍历目录 |
os.path.join(path1,path2) | 将path1和path2拼接成一个正常的路径 |
os.path.splitext() | 获取文件扩展名 |
**os.path.isdir() **** | 判断是否是目录 |
**os.path.isfile() **** | 判断是否是文件 |
**os.path.exists() **** | 判断文件或者目录是否存在 |
**os.path.getsize() **** | 获取文件的大小(字节) |
os.path.dirname() | 获取路径的目录名 |
os.path.basename() | 获取路径的文件名 |
os.path.abspath() | 返回文件的绝对路径 |
os.path.split() | 拆分路径 |
1.2 目录的遍历
- 深度优先
- 广度优先遍历
三、正则表达式
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
- 需要引入内置模块re
- 缺点:效率低下,能用字符串方法完成尽量使用字符串的方法
- 优点:编码简单
1.为什么使用正则表达式
- 使用场景
- 敏感词过滤
- 手机、邮箱等验证
- 爬虫
2.正则表达式的组成
-
原子
组成正则表达式的最小单位,任何字符都可以原子 含义 原子 含义 \d 0-9中任何一个字符 \w 0-9a-zA-Z_的中任何一个字符 \D 非0-9中的任何一个字符 [^0-9]
\W 非0-9a-zA-Z_的中任何一个字符[^0-9a-z_A-Z] \s \n\r\t 空格 . 代表除\n之外的任何字符 \S 非\n\r\t 空格中任何一个字符 [^\n\t\r ]
\b 词边界 [] 自己创建的原子表,[0-4]代表0-4中任何一个字符 \B 非词边界 [^] 排除原子表中的字符 \A
字符串开始 ^ 行首;在原子表中表示排除 \Z
字符串的结尾 $ 行结尾 - 表示域,0-9就表示0到9所有数字字符 -
元字符
元字符能够增强原子的描述能力元字符 含义 元字符 含义 {} 表示重复前一个原子的次数 * 重复0次或多次 {0,} {m} 表示重复前一个原子的m次 + 至少出现1次 {1,} {m,n} 表示重复前一个原子的最少m次,最多n次 ? 出现0次或1次 {0,1} {m,} 表示重复前一个原子的最少m次 *?,+? 取消贪婪 () 改变优先级,取子元素 x|y 表示匹配x或者y -
模式修正符
修饰符 含义 修饰符 含义 re.S 使.匹配所有字符 re.I 不区分大小写 re.L 本地化识别 re.M 多行匹配 re.U 根据Unicode字符集解析字符,会影响\b、\B、\w、\W
注意:
- 模式字符串一定要使用原字符串,也就是用r开头的字符串。r’www’
- 严格区分大小写
- 如果正则表达式中有{,},[,],-,?,*,|^,$,.等做普通字符,则要将其转义
3.正则常用方法
-
re.match()
原型:re.match(pattern,string,flags=0) 功能:从字符串起始位置匹配一个模式,如果不是从起始位置匹配则返回None 参数:patter 模式 string 要匹配的字符串 flag 模式修正符 返回值: 匹配成功返回一个Match object,失败返回None print(re.match(r'www','www.baidu.com')) print(re.match(r'www','http:///www.baidu.com')) #None print(re.match(r'www','cctv.www.baidu.com')) #None
-
re.search()
原型:re.search(pattern, string, flags=0) 功能:顺序扫描字符串,找到第一个匹配项结束 参数:patter 模式 string 要匹配的字符串 flag 模式修正符 返回值:匹配成功,返回match object,否则返回None print(re.search(r'll','hello')) print(re.search(r'll','heLLo',re.I))
-
re.findall()
原型:findall(pattern, string, flags=0) 功能:扫描整个字符串,并返回结果列表 参数:patter: 匹配的正则表达式 string: 要匹配的字符串 flags:模式修正符 返回值:如果匹配成功返回一个列表,包含了所有匹配项,失败返回空列表 print(re.findall(r'oo','kksdkoosdflsdfooksdfsdoOppppweOo',re.I)) #['oo', 'oo', 'oO', 'Oo']
-
re.split
原型:split(pattern, string,maxsplit=0,, flags=0) 功能:用模式做分隔符,将字符串分隔,返回分隔列表,如果模式加上括号,则分隔符会被保留 参数:patter: 匹配的正则表达式 string: 要匹配的字符串 maxsplit 匹配次数,0不限制次数 flags:模式修正符 print(re.split(r'\d|,|;','w1w2w3w,w;w'))#['w', 'w', 'w', 'w', 'w', 'w']
-
re.sub和re.subn
sub(pattern, repl, string, count=0) subn(pattern, repl, string, count=0) 功能:在目标字符串中以正则表达式的规则匹配字符串,再把他们替换成指定的字符串。可以指定替换的次数, 如果 不指定,替换所有的匹配字符串 参数: pattern: 正则表达式(规则) repl: 指定的用来替换的字符串 string: 目标字符串 count: 最多替换次数 区别:前者返回一个替换后的字符串,后者返回一个元组,第一个元素替换后的字符串, 第二个元素表示被替换的次数 print(re.sub(r"(good)", "nice", "cheng is good man")) print(re.subn(r"(good)", "nice", "cheng is good man"))
-
re.group()和re.groups()
用于提取子元素,模式中一个括号就是一个子元素,group和groups只能在match和search方法里使用,通过返回的match object获取子元素。在模式串和sub和subn中的替换字符串中可以使用\1,\2,\3…来引用子元素
m = re.match(r"(\d{3})-(\d{8})", "010-53247654") #使用序号获取对应组的信息,group(0)一直代表的原始字符串 print(m.group(0)) print(m.group(1)) print(m.group(2)) #查看匹配的各组的情况 print(m.groups())
-
compile
当我们使用正则表达式时,re模块会干两件事
1、编译正则表达式,如果正则表达式本身不合法,会报错
2、用编译后的正则表达式去匹配对象编译正则表达式使用compile
原型:re.compile(pattern, flags=0) 功能:将正则表达式模式编译成正则表达式对象,其 match() 和 search() 方法可用于匹配 参数:pattern 模式 flags 模式修正符 re_telephon = re.compile(r"^1(([3578]\d)|(47))\d{8}$") #编译,返回 print(re_telephon.match("13600000000")) #
4.应用实例
- 看样子
- 写一点,测一点