day17回顾
1.文件操作
打开文件,文件读写,关闭文件
with open(文件路径,打开方式,encoding='utf-8') as 文件对象:
文件对象.read() - 读
文件对象.write(内容) - 写
2.json数据
json数据: 一个json有且只有一个数据;这个数据类型是json支持的数据类型
number,string,boolean,array(list),dictionary(dict),null(None)
json数据转python数据:
json.loads(字符串,编码类型) - 数据操作
json.load(字符串) - 文件操作
python数据转json数据:
json.dumps(python数据) - 数据操作
json.dump(python数据,文件对象) - 文件操作
regular
1.什么是正则表达式
正则表达式是字符串匹配工具,它是为了在某些需求下可以更方便,更快速的处理字符串
2.什么是正则表达式处理字符串
python通过提供re模块来支持我卖你正则表达式
re.fullmatch(正则表达式,字符串) - 让正则表达式和字符串进行完全匹配,返回匹配街故宫,如果匹配不成功返回None
3.怎么写正则表达式
python中正则表达式是放在字符串中,并且这个字符串一般会在最前面加r/R
r'正则'
4.正则语法
-
- 普通字符 - 代表字符本身
re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)
-
- . - 匹配一个任意字符
一个 . 代表一个字符,匹配的是任意字符
# 匹配一个字符串,长度是4,第一个字符是任意字符,后面三位是'abc'
re_str = r'.abc'
result = re.fullmatch(re_str, '1abc')
print(result)
-
- \w - 匹配一个ASCII表中字母,数字或者下划线,还可以匹配所有的非ASCII表字符
re_str = r'.\w'
result = re.fullmatch(re_str, 'ss')
print(result)
-
- \s - 匹配一个空白字符
空白字符包括:空格,回车,制表符
# 匹配一个字符串有4个字符,第一个字符是空白,后面三个任意字符
re_str = r'\s...'
result = re.fullmatch(re_str, '\t456')
print(result)
-
- \d - 匹配一个数字字符
# 匹配一个字符串长度是5,前面三个字符是成绩:后面是两个数字
re_str = r'成绩:\d\d'
result = re.fullmatch(re_str, '成绩:44')
print(result)
-
- \b - 检测单词边界(检测\b是否是单词边界)
单词边界:所有能够标示一个单词结束的符号都是单词边界例如:空格,回车,标点符号等,字符串开头,字符串结束
"""
# 匹配一个字符串是否是'howare,'并且要求w的后面(a的前面)是一个单词边界
re_str = r'how\b,are'
result = re.fullmatch(re_str, 'how,are')
print(result)
-
- ^ - 检测是否是字符开头
# 匹配两个数字字符的字符串,并且建设这个字符串时候是字符串开头
re_str = r'^how\b,are'
result = re.fullmatch(re_str, 'how,are')
print(result)
-
- $ - 检测是否是字符串的结尾
-
- \大写字母 - 对\小写字母功能的否定
a.\W - 匹配非数字,字母,下划线
b.\S - 匹配非空白字符
c.\D - 匹配非数字字符
d.\B - 检测是否是非单词边界
re_str = r'\W\S\D\Bb'
result = re.fullmatch(re_str, '~ovb')
print(result)
-
- [字符集] - 匹配[]中任意的一个字符
a.取出字符集中的一个
[普通字符集] - 匹配[]中任意的一个字符
例如:[abc],[ab\d]
b.用'-'表示范围
[字符1-字符2] - 匹配编码值再字符1编码到字符2编码之间的任意一个字符(ord(字符1)
-
- 转义符号 - 将正则中有特殊意义或者特殊功能的符号,表示符号本身(让特殊意义消失)
有歧义产生是使用''
- 转义符号 - 将正则中有特殊意义或者特殊功能的符号,表示符号本身(让特殊意义消失)
a.在中括号外面
在特殊意义的符号前加''让其特殊意义消失
b.在中括号里面
单独的有特殊意义的符号,除了 '^' 在最前面,'-'在两个字符之间,让其他都不需要转义,特殊意义自动消失
re_str = r'[1-9]\d+\.\d\d'
print(re.fullmatch(re_str, '1910.45'))
regular
1.匹配次数
-
-
-
- 匹配0次或者多次
-
-
r'abc' - 匹配一个字符串'bc'前有0个或者多个a
r'\d' - 匹配一个字符串由0个或者多个任意数字字符组成
# 练习:写一个正则表达式能够匹配所有的小数
re_str = r'[1-9]\d*\.\d*\d'
result = re.fullmatch(re_str, '1.0')
print(result)
-
-
-
- 匹配一次或者多次(至少一次)
"""
r'\d+' - 数字出现一次或者多次
r'[abc]+' - 匹配一个字符串有一个或者多个字符,每一个字符是abc中的一个
"""
- 匹配一次或者多次(至少一次)
-
-
-
- {}
{N} - 匹配N次, {3}匹配3次
{M,N} - 匹配M到N次
{M,} - 匹配至少M次
{,N} - 匹配最多N次
re_str = r's\d{3}'
result = re.fullmatch(re_str, 's123')
print(result)
======贪婪和非贪婪======
2. 贪婪和非贪婪
a.以上是贪婪匹配:匹配次数不确定的时候,尽可能多
b.非贪婪:
-
- ? - 匹配一次或者0次
-
- 在匹配次数不确定的符号后面加?
在匹配次数不确定的符号后面加?
*?
+?
{M,N}?
{M,}?
{,N}?
3.=====分之(选择)=====
分之符号 | - 相当于逻辑运算里面的or
正则1|正则2 - 先用正则1去匹配如果匹配成功就成功,匹配不成功在使用正则2去匹配
(字符串能和正则1,正则2中任意一个匹配成功就成功)
r'\d{6,12}|[A-Za-z]{6,12}'
4.=====分组:()=====
a.将小括号里面的内容作为一个整体操作
b.\数字 -- 重复第几个分组匹配结果(必须要有分组)
"""
# 用户名是7-13位,最后两位必须是aa或者bb或者cc
re_str = r'[a-zA-Z\d]{5,11}(aa|bb|cc)'
re模块
1.完全匹配 - 让字符串的长度和字符串的每个字符的值和正则表达式完全匹配
"""
re.fullmatch(正则表达式, 字符串) - 匹配成功返回匹配对象,返回失败返回None
当需要队整个字符串进行条件判断的时候使用:例如,检查账号是否合法,密码是否符合要求等
result = re.fullmatch(r'(\d{3})=([a-z]{3})', '234=asd')
print(result)
-
- span - 匹配到的内容在原字符串的位置
print(result.span()) # 整个正则表达式匹配结果的范围
print(result.span(1)) # 正则表达式中第一个分组匹配结果的范围
print(result.start(2), result.end(2))
- 2)获取匹配到的值
print(result.group()) # 整个正则表达式匹配结果
print(result.group(1)) # 正则表达式中第一个分组匹配结果
3)获取原字符串
print(result.string)
2.匹配字符串开头
re.match(正则表达式, 字符串) - 判断字符串的开头是否和正则表达式相匹配.匹配成功返回匹配对象,匹配失败返回None
只检测字符串开头开头是否满足要求
result = re.match('\d{3}', '234456')
print(result)
3.search
re.search(正则表达式, 字符串) - 在字符串中查找哦是否有和正则表达式匹配的子串,
如果没有返回None,如果有就返回第一个匹配结果
method
result = re.search(r'(\d{3})=([a-z]{3})', 'how 234=abced842=abc===')
print(result, result.span(1), result.group(1))
## 4.findall
re.findall(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串,以列表的形式返回
注意: 正则表达式中有分组的时候
没有分组 - 整个正则表达式匹配的结果作为列表元素(列表元素是字符串)
有一个分组 - 这个分组匹配到的结果作为列表元素(列表元素是字符串)
两个以上分组 - 这个分组匹配到的结果作为列表元素(列表元素是元祖,几个分组,元祖有几个元素)
```python
result = re.findall(r'(\d+)([a-z])', 'are sda46ada456sd465ds564')
print(result)
5.finditer
re.finditer(正则表达式,字符串) - 获取字符串中所有能够和正则表达式匹配的子串的匹配结果.
返回值是一个迭代器,迭代器中的元素是匹配结果
result = re.finditer(r'abc(\d|[A-Z]{2})', 'abc4-abcHD===')
print(list(result))
for item in result:
print(item.group())
print(item.group(1))
# 练习:计算一个字符值所有数字的和
# re 89he ks90.2 ans78oo1.23h!w9end9009ooo
re_str = r're 89he ks90.2 ans78oo1.23h!w9end9009ooo'
result = re.findall(r'(\d+\.?\d*)', re_str)
print(result)
n = 0
for item in result:
n += float(item)
print(n)
** 短路操作 | 写在前面的会先匹配,匹配成功不会管后面的**
6.split
re.split(正则表达式,字符串) - 将字符串按照满足正则表达式的子串进行切割
result = re.split(r'[=/+-]', 'aaa+hhh-jjj/kkk')
print(result)
7.sub
re.sub(正则表达式,新字符串,字符串,替换次数) - 将字符串中满足正则表达式的子串替换成新字符串
替换次数不赋值,表示全部替换
result = re.sub(r'\d+', '=', 'das45ad12das46s21')
print(result)