Python学习笔记(4)

正则表达式

正则表达式的定义

  • 定义:正则表达式是一个特殊的字符序列,一个字符串是否与我们所设定的这样的字符序列相匹配。
  • 作用:快速检索文本,实现一些替换文本的操作
  • Python 中的正则表达式模块:re

元字符和普通字符

  • 普通字符:abc
  • 元字符:\d, \D, \f, \n等,每种元字符都有不同的含义
  • 正则表达式就是普通字符和元字符组成的

字符集

  • 中括号中的字符是的关系
  • 取反使用^
  • 范围:[a-z], [a-zA-Z]
1
2
3
s = 'abc, acc, adc, aec, afc, ahc'
r = re.findall('a[^cfC]c', s) # 表示已a开头,c结尾,中间的一个字母不是c,f,C中的任何一个
print(r) # ['abc', 'adc', 'aec', 'ahc']

概括字符集

  • \d 代表数字,相当于[0-9]
  • \D 代表非数字,相当于[^0-9]
  • \w 代表单词字符,相当于[0-9a-zA-Z_]
  • \W 代表非单词字符,相当于[^0-9a-zA-Z_]
  • \s 代表空白字符
  • \S 代表非空白字符
  • . 代表除换行符的所有字符

数量词

  • [a-z]{3,6} 匹配 3 到 6 次

贪婪和非贪婪

  • 贪婪:尽可能多的匹配,一直到不满足条件为止
  • 非贪婪:一旦满足条件就停止匹配
  • Python 倾向于贪婪模式
1
2
3
4
5
# 匹配3-6个字母,贪婪模式下,会匹配尽可能多的字母,直到不满足条件,因此会匹配出['python', 'java', 'php']
# 非贪婪模式下会匹配3个字符,【'pyt', 'hon', 'jav', 'php']
a = 'python 111java678php'
r = re.findall('[a-z]{3,6}', a) # 贪婪模式
r = re.findall('[a-z]{3,6}?', a) # 非贪婪模式,加一个问号

匹配 0 次,1 次或无限次

  • *匹配前面的字符 0 次或 n 次
  • +匹配前面的字符 1 次或 n 次
  • ?匹配前面的字符 0 次或 1 次,要与非贪婪模式的问号区分

边界匹配符

  • ^首部,^000开头三个字符为000
  • $尾部,000$结尾三个字符为000

  • 一个括号对应一组,(Python){3},把一个组重复 3 次
  • 组中的每个字符是且的关系

匹配模式参数

  • 忽略字母大小写: re.I
  • .表示匹配任意字符: re.S
1
2
3
s = 'abc, acc, adc, aec, afc, ahc, aFc'
r = re.findall('a[cf]c', s, re.I) # 忽略大小写
print(r) # ['acc', 'afc', 'aFc']

re.sub 正则替换

1
2
3
4
5
6
7
8
9
10
11
12
13
a = 'python 111java678php'
r1 = re.sub('\w{3,6}', "hhh", a, 1) # 最后一个参数1表示替换几个

print(r1) # hhh 111java678php


def convert(value):
return 'aa' + value.group() # value.group()为匹配到的字符串


# 第二个参数为一个函数,匹配到后会把匹配的结果传给函数执行,并把函数返回的结果作为替换字符串
r2 = re.sub('\w{3,6}', convert, a)
print(r2) # aapython 111java678php

match 与 search 函数

  • match 函数:从字符串的首字母开始匹配,如果首字母没有匹配到则返回空
  • search 函数:搜索字符串,知道找到第一个符合要求的字符串
  • match 和 search 只匹配一个结果,findall 会匹配所有符合条件的字符串

group 分组

  • 使用括号进行分组
1
2
3
4
5
6
7
s = 'life is short, i use python, i love python'
r = re.search('life(.*)python(.*)python', s)
print(r.group(0)) # `life is short, i use python, i love python` (默认第0个分组为字符串本身)
print(r.group(1)) # ` is short, i use`
print(r.group(2)) # `, i love`
print(r.group(0, 1, 2)) # ('life is short, i use python, i love python', ' is short, i use ', ', i love ')
print(r.groups()) # (' is short, i use ', ', i love ') (不会返回完整字符串)

JSON

理解 JSON

  • JSON 是一种轻量级的数据格式
  • 字符串是 JSON 的表现形式
  • JSON 字符串:符合 JSON 格式的字符串
  • JSON 对象:Python 中没有 JSON 对象,JS 中有 JSON 对象

JSON 的特点

  • 易于阅读
  • 易于解析
  • 网络传输效率高
  • 跨语言交换数据

反序列化

  • Python 中会把 JSON 字符串解析成字典或列表
  • Python 中的数据类型对应 JSON 中的数据类型:

1

1
2
3
4
5
import json
# 这里必须是里面是双引号,外面是单引号,false和true首字符必须小写
s = '{"name": "ljl", "age": 12, "flag": true}'
a = json.loads(s) # Python中会把JSON字符串解析成字典或列表
print(a) # {'name': 'ljl', 'age': 12, 'flag': True}

序列化

1
2
s1 = json.dumps(a)
print(s1)

枚举

枚举类型(Python3)

  • 枚举也是一个类
  • 枚举在 Python3 中才有,Python2 中没有枚举类
1
2
3
4
5
6
7
8
9
10
from enum import Enum

class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4

print(VIP.YELLOW) # VIP.YELLOW
print(VIP.YELLOW == VIP.GREEN) # false

枚举的优势

  • 不可变
  • 值不会重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from enum import Enum

class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4
# BLACK = 5 # error
YELLOW_ALIAS = 1 # YELLOW的别名


print(VIP.YELLOW) # VIP.YELLOW
print(VIP.YELLOW == VIP.GREEN) # false
VIP.YELLOW = 3 # error,枚举的值不能改变

枚举的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print(VIP.YELLOW)  # VIP.YELLOW,枚举类型
print(VIP.YELLOW.value) # 1,枚举的值
print(VIP.YELLOW.name) # YELLOW,枚举的名字

# 枚举的遍历,遍历时别名不会遍历
# VIP.YELLOW
# VIP.GREEN
# VIP.BLACK
# VIP.RED
for v in VIP:
print(v)

# 遍历枚举的所有值,包括别名
for v in VIP.__members__:
print(v)

# 枚举的比较
print(VIP.YELLOW == VIP.GREEN) # false
print(VIP.YELLOW == VIP.YELLOW) # false
print(VIP.YELLOW == 1) # false
# print(VIP.YELLOW < VIP.GREEN) # error,枚举不可以进行大小比较
print(VIP.YELLOW.value == 1) # true
print(VIP.YELLOW == VIP.YELLOW_ALIAS) # true

枚举的转换

1
2
3
4
5
6
7
8
9
10
class VIP(Enum):
YELLOW = 1
GREEN = 2
BLACK = 3
RED = 4


a = VIP(1) # a 初始化为VIP.YELLOW
print(a) # VIP.YELLOW
print(a == VIP.YELLOW) # true