正则表达式
1、正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串
2、正则表达式一般包括:原本字符和元字符
3、()表示一个组,通俗的理解就是可以用它来标记一个表达式组的开始和结束
元字符 | 匹配规则 | 限定符 | 匹配次数 |
. |
可以匹配除“\n”和"\r"之外的任何单个字符,汉字、字母、符号、数字 (注意是单个,就是一个) |
+ | 至少匹配一次 |
\d | 匹配任意单个数字 | ? | 最多匹配一次 |
* | 匹配0次或者多次 |
4、例子:
data = '{"mobilephone": "#normal_user#", "pwd": "#normal_pwd#"}'
# 1、正则表达式
p='normal_user' # 原本字符
p='#(.*?)#' # 元字符
# 2、两种查找方式
ms=re.findall(p,data) # 查找全部,返回列表
print(ms) # p='#.*?#' ==>['#normal_user#', '#normal_pwd#'] p='#(.*?)#'==>['normal_user', 'normal_pwd']
m=re.search(p,data) #从data任意位置开始找,找到第一个就返回
print(m) # ==><re.Match object; span=(17, 30), match='#normal_user#'>
print(m.group(0)) # 返回表达式和组里面的内容 ==>#normal_user#
print(m.group(1)) # 只返回指定组里面的内容 ==>normal_user
g=m.group(1)
# 3、根据查找到的key,取配置文件里面同个key的值
v= config.get_strValue("data",g) # 根据Key值取配置文件里面的值
# 4、查找替换
data_new=re.sub(p,v,data,count=1) # 查找替换(p:正则表达式,v:替换的内容,data:原本目标,count:查找替换次数(0表示全部替换))
print(data_new)
# 如果要匹配多次,替换多次,使用循环来解决
while re.search(p,data):
print(data) # 第一次:{"mobilephone": "#normal_user#", "pwd": "#normal_pwd#"} 第二次:{"mobilephone": "18825046772", "pwd": "#normal_pwd#"}
m = re.search(p, data) # 从data任意位置开始找,找到第一个就返回Match object,如果没有就返回None
g = m.group(1) # 拿到参数化的KEY
v = config.get_strValue("data", g) # 根据Key值取配置文件里面的值
# 记得替换后的内容,继续用data接收
data = re.sub(p, v, data, count=1) # 查找替换(p:正则表达式,v:替换的内容,data:原本目标,count:查找替换次数(0表示全部替换))
print(data) #替换后的最终结果:{"mobilephone": "18825046772", "pwd": "123456"}
封装成一个函数
import re
from homework.exam_homework_0413.common.read_config import config
def replace(data,patten = '#(.*?)#'):
# patten = '#(.*?)#' # 正则表达式
print("替换前的data:{}".format(data))
while re.search(patten, data):
m = re.search(patten, data) # 从data任意位置开始找,找到第一个就返回Match object,如果没有就返回None
g = m.group(1) # 拿到参数化的KEY
v = config.get_strValue("data", g) # 根据Key值取配置文件里面的值
# 记得替换后的内容,继续用data接收
data = re.sub(patten, v, data, count=1) # 查找替换(p:正则表达式,v:替换的内容,data:原本目标,count:查找替换次数(0表示全部替换))
print("替换后的data:{}".format(data))
return data