【是什么】:特殊的序列。检测字符串是否与序列匹配。
【有什么作用】:实现快速检索文本,或实现替换文本的操作。
实战:查看字符串是否包含Python/ target=_blank class=infotextkey>Python
a = "C|JAVA|C#|python|php|JS"
# 方法一
print(a.index("python"))
# 方法二
import re
r = re.findall("python", a)
if len(r) != 0:
print("字符串中包含python")
输出:
10
字符串中包含python
实战:在字符串中把所有的数字提取出来
a = "C123Java321C#455python1321PHP1243JS"
import re
r = re.findall("d", a)
print(r)
r = re.findall("D", a)
print(r)
输出:
['1', '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']
实战:查找中间单词是 c,或者 f 的字符集
import re
a = "abc,acc,afc,adc,arc"
r1 = re.findall("a[cf]c", a)
r2 = re.findall("a[^cf]c", a)
r3 = re.findall("a[c-f]c", a)
print(r1)
print(r2)
print(r3)
输出:
['acc', 'afc']
['abc', 'adc', 'arc']
['acc', 'afc', 'adc']
w : 表示字母 a-z、A-Z 和数字0-9 和 _
import re
a = "a bc!acc$afc@adc!arc_"
r1 = re.findall("w", a)
r2 = re.findall("W", a)
print(r1)
print(r2)
输出:
['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_"
r1 = re.findall("s", a)
r2 = re.findall("S", a)
print(r1)
print(r2)
输出:
[' ']
['a', 'b', 'c', '!', 'a', 'c', 'c', '$', 'a', 'f', 'c', '@', 'a', 'd', 'c', '!', 'a', 'r', 'c', '_']
. :表示除换行符之外的所有字符
实战:把python匹配出来
import re
a = "c123java321C#455python1321php1243JS"
r1 = re.findall("[a-z][a-z][a-z][a-z][a-z][a-z]", a)
r2 = re.findall("[a-z]{6}", a)
print(r1)
print(r2)
输出:
['python']
['python']
实战:把 python,java,php 匹配出来
import re
a = "c123java321C#455python1321php1243JS"
r1 = re.findall("[a-z]{3,6}", a)
print(r1)
输出:
['java', 'python', 'php']
默认情况,python是贪婪模式,匹配最多的合适的数量。
? :在数字范围后表示非贪婪
实战: 获取3个字母
import re
a = "c123java321C#455python1321php1243JS"
r1 = re.findall("[a-z]{3,6}?", a)
r2 = re.findall("[a-z]{3}", a)
print(r1)
print(r2)
输出:
['jav', 'pyt', 'hon', 'php']
['jav', 'pyt', 'hon', 'php']
*表示匹配前面的字符0次或者多次
+表示匹配前面的字符1次或者多次
?表示匹配前面的字符0次或者1次,可以做去除的操作
import re
a = "pytho0python1pythonn2pythonnn333"
r1 = re.findall("python*", a)
r2 = re.findall("python+", a)
r3 = re.findall("python?", a)
r4 = re.findall("python{1,3}?", a) # 表示非贪婪模式
print(r1)
print(r2)
print(r3)
print(r4)
输出:
['pytho', 'python', 'pythonn', 'pythonnn']
['python', 'pythonn', 'pythonnn']
['pytho', 'python', 'python', 'python']
['python', 'python', 'python']
实战: 验证位数是否符合
import re
a = "100086"
r1 = re.findall("d{3,5}", a)
r2 = re.findall("^d{3,5}$", a)
print(r1)
print(r2)
输出:
['10008']
[]
import re
a = "100086"
r1 = re.findall("086$", a)
r2 = re.findall("^1000", a)
r3 = re.findall("000$", a)
r4 = re.findall("^000", a)
print(r1)
print(r2)
print(r3)
print(r4)
输出:
['086']
['1000']
[]
[]
判断字符串中是否包含 2个python
import re
a = "pythonpython2pythonpython2nvvpythonpythonn"
r1 = re.findall("(python){2}", a)
r2 = re.findall("(python){2}(2)", a)
print(r1)
print(r2)
输出:
['python', 'python', 'python']
[('python', '2'), ('python', '2')]
flags=re.I : 表示不区分大小写
| : 连接多个模式,且
import re
a = "pc#ythonpython2pythonpython2nvvpythonpythonn"
r1 = re.findall("C#", a,flags=re.I)
print(r1)
输出:
['c#']
re.S : 表示 .匹配所有字符,包括换行符
import re
a = "pc#nythonpython2pythonpython2nvvpythonpythonn"
r1 = re.findall("C#.{1}", a, flags=re.I | re.S)
print(r1)
输出:
['c#n']
re.sub("正则匹配规则",“需要换成的字符串”,“查找的字符串”,count=0,flag)
实战 : c# 换成 python
import re
a = "c#phpc#javac#"
r1 = re.sub("c#", "python", a)
输出:
pythonphppythonjavapython
count=0 :默认是0,所能被替换的最大选项
import re
a = "c#phpc#javac#"
r1 = re.sub("c#", "python", a,count=1)
输出:
pythonphpc#javac#
内置函数 replace 同样可以实现替换
a = "c#phpc#javac#"
print(a.replace("c#", "python"))
输出:
pythonphppythonjavapython
sub第二个参数,可以接收函数。
根据不同的匹配结果做不同的操作。
import re
def conver(value):
print(value)
matched = value.group()
print(matched)
return "111" + matched + "111"
a = "c#phpc#javac#"
r1 = re.sub("c#", conver, a)
print(r1)
输出:
<re.Match object; span=(0, 2), match='c#'>
c#
<re.Match object; span=(5, 7), match='c#'>
c#
<re.Match object; span=(11, 13), match='c#'>
c#
111c#111php111c#111java111c#111
实战:匹配字符串,数字大于60变成9,否则变成0
import re
def conver(value):
matched = value.group()
if int(matched) >= 60:
return "9"
else:
return "0"
a = "ABC123987456DE"
r1 = re.sub("d{2}", conver, a)
print(r1)
输出:
ABC00906DE
a = "1490ABC123987456DE"
r1 = re.match("d", a) #从字符串首字母开始匹配
print(r1.group())
r2 = re.search("d", a) #搜索字符串,直到找到满足条件的字符串
print(r2.group())
print(r2.span()) # 返回位置
输出:
1
1
(0, 1)
实战:获取 A 和 E 中间的字符
0 是默认取值 ,获取完整匹配结果。
a = "A 14956 63E234234E"
r1 = re.match("A(.*)E", a)
print(r1.group(1)) 1 是第一个组
r1 = re.match("A(.*)E(.*)E", a) # 可以有很多个组
print(r1.group(0, 1, 2))
print(r1.groups()) # 把匹配到的内容输出
print(re.findall("A(.*)E(.*)E", a))
输出:
14956 63E234234
('A 14956 63E234234E', ' 14956 63', '234234')
(' 14956 63', '234234')
[(' 14956 63', '234234')]
【Json】 是一种轻量级的数据交换格式。
【JSON字符串】:符合json格式的字符串
【优势】:易于阅读,解析,网络传输效率高。跨语言交换数据。
【反序列化】json.loads()
json字符串需要用双引号。
实战:json字符串转换python的字典
import json
j_str = '{"name":"CiCi","age":18}'
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}