(1) 正则表达式
【是什么】:特殊的序列。检测字符串是否与序列匹配。
【有什么作用】:实现快速检索文本,或实现替换文本的操作。
实战:查看字符串是否包含python
- findal查找全部
- re.findall(需要匹配的内容, 查找的字符串)
a = "C|Java|C#|python|PHP|JS" | |
# 方法一 | |
print(a.index("python")) | |
# 方法二 | |
import re | |
r = re.findall("python", a) | |
if len(r) !=: | |
print("字符串中包含python") | |
输出: | |
字符串中包含python |
(2) 元字符与普通字符
实战:在字符串中把所有的数字提取出来
- ‘python’ 是普通字符
- ‘\d’ 是元字符,表示数字:0-9 ,代表一定的意义
- ‘\D’ 表示‘\d’的相反,不是0-9
a = "CJava321C#455python1321PHP1243JS" | |
import re | |
r = re.findall("\d", a) | |
print(r) | |
r = re.findall("\D", a) | |
print(r) | |
输出: | |
['', '2', '3', '3', '2', '1', '4', '5', '5', '1', '3', '2', '1', '1', '2', '4', '3'] | |
['C', 'J', 'a', 'v', 'a', 'C', '#', 'p', 'y', 't', 'h', 'o', 'n', 'P', 'H', 'P', 'J', 'S'] |
(3) 字符集
实战:查找中间单词是 c,或者 f 的字符集
- [] 可以抽象字符集,可以抽象c或者f,借助普通字符a和c来进行定界
- ^ 表示否的意思
- – 表示顺序,匹配 a 到 f 的字符
import re | |
a = "abc,acc,afc,adc,arc" | |
r = re.findall("a[cf]c", a) | |
r = re.findall("a[^cf]c", a) | |
r = re.findall("a[c-f]c", a) | |
print(r) | |
print(r) | |
print(r) | |
输出: | |
['acc', 'afc'] | |
['abc', 'adc', 'arc'] | |
['acc', 'afc', 'adc'] |
(4) 元字符还有什么
\w : 表示字母 a-z、A-Z 和数字0-9 和 _
import re | |
a = "a bc!acc$afc@adc!arc_" | |
r = re.findall("\w", a) | |
r = re.findall("\W", a) | |
print(r) | |
print(r) | |
输出: | |
['a', 'b', 'c', 'a', 'c', 'c', 'a', 'f', 'c', 'a', 'd', 'c', 'a', 'r', 'c', '_'] | |
[' ', '!', '$', '@', '!'] |
\s : 表示空白字符
import re | |
a = "a bc!acc$afc@adc!arc_" | |
r = re.findall("\s", a) | |
r = re.findall("\S", a) | |
print(r) | |
print(r) | |
输出: | |
[' '] | |
['a', 'b', 'c', '!', 'a', 'c', 'c', '$', 'a', 'f', 'c', '@', 'a', 'd', 'c', '!', 'a', 'r', 'c', '_'] |
. :表示除换行符之外的所有字符
(5) 数量词
实战:把python匹配出来
- 表示重复的字符集,可以用数字表示
- {} 里面写的数字,表示重复几次
import re | |
a = "cjava321C#455python1321php1243JS" | |
r = re.findall("[a-z][a-z][a-z][a-z][a-z][a-z]", a) | |
r = re.findall("[a-z]{6}", a) | |
print(r) | |
print(r) | |
输出: | |
['python'] | |
['python'] |
实战:把 python,java,php 匹配出来
- {} 里面写的数字,可以写有多少到多少的数字
import re | |
a = "cjava321C#455python1321php1243JS" | |
r = re.findall("[a-z]{3,6}", a) | |
print(r) | |
输出: | |
['java', 'python', 'php'] |
(6) 贪婪与非贪婪
默认情况,python是贪婪模式,匹配最多的合适的数量。
? :在数字范围后表示非贪婪
实战: 获取3个字母
import re | |
a = "cjava321C#455python1321php1243JS" | |
r = re.findall("[a-z]{3,6}?", a) | |
r = re.findall("[a-z]{3}", a) | |
print(r) | |
print(r) | |
输出: | |
['jav', 'pyt', 'hon', 'php'] | |
['jav', 'pyt', 'hon', 'php'] |
(7) 匹配0次1次或者无限多次
*表示匹配前面的字符0次或者多次
+表示匹配前面的字符1次或者多次
?表示匹配前面的字符0次或者1次,可以做去除的操作
import re | |
a = "pythopython1pythonn2pythonnn333" | |
r = re.findall("python*", a) | |
r = re.findall("python+", a) | |
r = re.findall("python?", a) | |
r = re.findall("python{1,3}?", a) # 表示非贪婪模式 | |
print(r) | |
print(r) | |
print(r) | |
print(r) | |
输出: | |
['pytho', 'python', 'pythonn', 'pythonnn'] | |
['python', 'pythonn', 'pythonnn'] | |
['pytho', 'python', 'python', 'python'] | |
['python', 'python', 'python'] |
(8) 边界匹配符
实战: 验证位数是否符合
- ^ 表示从字符串前面开始匹配
- $ 表示从字符串后面开始匹配
import re | |
a = "" | |
r = re.findall("\d{3,5}", a) | |
r = re.findall("^\d{3,5}$", a) | |
print(r) | |
print(r) | |
输出: | |
[''] | |
[] | |
import re | |
a = "" | |
r = re.findall("086$", a) | |
r = re.findall("^1000", a) | |
r = re.findall("000$", a) | |
r = re.findall("^000", a) | |
print(r) | |
print(r) | |
print(r) | |
print(r) | |
输出: | |
[''] | |
[''] | |
[] | |
[] |
(9) 组
判断字符串中是否包含 2个python
- python{3} : 表示单个n重复3次
- () :表示组,可以有多个组
- (python){3}表示一组的单词,重复3次
- [] 是或者的关系,()是且的关系
import re | |
a = "pythonpythonpythonpython2nvvpythonpythonn" | |
r = re.findall("(python){2}", a) | |
r = re.findall("(python){2}(2)", a) | |
print(r) | |
print(r) | |
输出: | |
['python', 'python', 'python'] | |
[('python', ''), ('python', '2')] |
(10) 匹配模式参数
flags=re.I : 表示不区分大小写
| : 连接多个模式,且
import re | |
a = "pc#ythonpythonpythonpython2nvvpythonpythonn" | |
r = re.findall("C#", a,flags=re.I) | |
print(r) | |
输出: | |
['c#'] |
re.S : 表示 .匹配所有字符,包括换行符
import re | |
a = "pc#\nythonpythonpythonpython2nvvpythonpythonn" | |
r = re.findall("C#.{1}", a, flags=re.I | re.S) | |
print(r) | |
输出: | |
['c#\n'] |
(11) re.sub正则替换
re.sub(“正则匹配规则”,“需要换成的字符串”,“查找的字符串”,count=0,flag)
实战 : c# 换成 python
import re | |
a = "c#phpc#javac#" | |
r = re.sub("c#", "python", a) | |
输出: | |
pythonphppythonjavapython |
count=0 :默认是0,所能被替换的最大选项
import re | |
a = "c#phpc#javac#" | |
r = re.sub("c#", "python", a,count=1) | |
输出: | |
pythonphpc#javac# |
内置函数 replace 同样可以实现替换
a = "c#phpc#javac#" | |
print(a.replace("c#", "python")) | |
输出: | |
pythonphppythonjavapython |
(12) 把函数作为参数传递
sub第二个参数,可以接收函数。
根据不同的匹配结果做不同的操作。
import re | |
def conver(value): | |
print(value) | |
matched = value.group() | |
print(matched) | |
return "" + matched + "111" | |
a = "c#phpc#javac#" | |
r = re.sub("c#", conver, a) | |
print(r) | |
输出: | |
<re.Match object; span=(, 2), match='c#'> | |
c# | |
<re.Match object; span=(, 7), match='c#'> | |
c# | |
<re.Match object; span=(, 13), match='c#'> | |
c#c#111php111c#111java111c#111 |
实战:匹配字符串,数字大于60变成9,否则变成0
import re | |
def conver(value): | |
matched = value.group() | |
if int(matched) >=: | |
return "" | |
else: | |
return "" | |
a = "ABCDE" | |
r = re.sub("\d{2}", conver, a) | |
print(r) | |
输出: | |
ABCDE |
(13) search与match函数
- 搜索到了一个,就停止搜索
- 返回结果都是组
- match 从字符串首字母开始匹配
- search 搜索字符串,直到找到满足条件的字符串
a = "ABC123987456DE" | |
r = re.match("\d", a) #从字符串首字母开始匹配 | |
print(r.group()) | |
r = re.search("\d", a) #搜索字符串,直到找到满足条件的字符串 | |
print(r.group()) | |
print(r.span()) # 返回位置 | |
输出: | |
(, 1) |
(14) group分组
实战:获取 A 和 E 中间的字符
0 是默认取值 ,获取完整匹配结果。
a = "A 63E234234E" | |
r = re.match("A(.*)E", a) | |
print(r.group(1)) 1 是第一个组 | |
r = re.match("A(.*)E(.*)E", a) # 可以有很多个组 | |
print(r.group(0, 1, 2)) | |
print(r.groups()) # 把匹配到的内容输出 | |
print(re.findall("A(.*)E(.*)E", a)) | |
输出: 63E234234 | |
('A 63E234234E', ' 14956 63', '234234') | |
(' 63', '234234') | |
[(' 63', '234234')] |
(15) JSON
【Json】 是一种轻量级的数据交换格式。
【JSON字符串】:符合json格式的字符串
- 字符串是json的一种表现形式。
【优势】:易于阅读,解析,网络传输效率高。跨语言交换数据。
(16)序列化与反序列化
【反序列化】json.loads()
json字符串需要用双引号。
实战:json字符串转换python的字典
import json | |
j_str = '{"name":"CiCi","age":}' | |
print(type(json.loads(j_str))) | |
输出: | |
<class 'dict'> |
json字符串的 true 和 false是小写开头的。
json字符串的 null 是 None。
import json | |
j_str = '[{"name":"CiCi","flag":true},{"name":"CiCi","flag":false}]' | |
print(json.loads(j_str)) | |
输出:[{'name': 'CiCi', 'flag': True}, {'name': 'CiCi', 'flag': False}] |
【序列化】json.dumps()
import json | |
dict_p = {"name": "CiCi", "flag": True} | |
print(json.dumps(dict_p)) | |
输出:{"name": "CiCi", "flag": true} |