正则替换数据
(1)匹配规则:元字符+限定符
常用反义词 | 常用限定符 | |
---|---|---|
.:匹配任意一个字符(除了\n) res1 = r"." res =re.findall(res1,"s1?") 参数1:匹配规则 参数2:要匹配的字符 ---》['s','1','?'] |
*重复零次或更多次 | |
\d:匹配数字,0-9 res3= r"\d" res =re.findall(res3,"123a6") 参数1:匹配规则 参数2:要匹配的字符 ---》['1','2','3','6'] |
\D:匹配非数字,即不是数字 res4= r"\D" res =re.findall(res4,"123a6\n") 参数1:匹配规则 参数2:要匹配的字符 ---》['a','\n'] |
+重复一次或更多次 |
\s:匹配空白,即空格。tab键 res5= r"\s" res =re.findall(res5,"12 3a 6") 参数1:匹配规则 参数2:要匹配的字符 ---》[' ',' ',' ']# tab键两个空白 |
\S:匹配非空白 res6= r"\s" res =re.findall(res6,"12 3a 6") 参数1:匹配规则 参数2:要匹配的字符 ---》['1',' 2',' 3','6'] |
?重复零次或一次(在给定返回后加?,变成非贪婪模式,匹配最少的) |
\w:匹配单词字符,即a-z,A-Z,0-9,单词,字母,下划线 res7= r"\w" res =re.findall(res7,"1_a?6\n") 参数1:匹配规则 参数2:要匹配的字符 ---》['1','_','a','6'] |
\W:匹配非单词字符 res8= r"\W" res =re.findall(res8,"1_a?6\n") 参数1:匹配规则 参数2:要匹配的字符 ---》['?',"\n'] |
{n}匹配一个字符n次 |
^匹配字符串的开始 | {n,}匹配一个字符至少n次 | |
$匹配字符串的结束 | {n,m}匹配一个字符出现n到m次 | |
\b匹配单词的边界 | \B匹配非单词的边界 | |
[]:列表中列举的字符res2= r"[abc]" res =re.findall(res2,"123a6b99cc") 参数1:匹配规则 参数2:要匹配的字符 ---》['a','b','c','c'] | ||
(2) python中通过re模块来处理正则表达式。re模块的常用方法如下:
-
re.match(re规则,字符串):从头开始匹配。从字符串的第一个字符开始匹配,返回的是一个匹配对象。如果第一个字符不匹配规则,则匹配失败。
-
re.search(re规则,字符串):匹配包含。查找第一个符合规范的字符串,返回的是一个匹配对象(通过group能找到的数据提取出来,如果没有找到符合规范的数据,返回的是None)
-
re.findall(re规则,字符串):把所有匹配的字符放在列表中并返回。
-
re.sub(re规则,替换串,被替换串,替换次数(非必填,默认替换所有符合规范的字符串)):匹配字符并替换。
(3)常用的匹配
-
匹配指定的字符串
import re s2 = '{"mobile_phone":"#admin_phone#","pwd":"#admin_pwd#"}' res2 = re.search("#(.+?)#", s2).group() res3 = re.search("#(.*?)#", s2).group() print(res2) # #admin_phone# print(res3) # #admin_phone# ss = '{"mobile_phone":"${admin_phone}","pwd":"#admin_pwd#"}' ress = re.search("\$\{(.*?)\}",ss).group() # $,{,}需要转译 print(ress) # ${admin_phone} # group:根据正则表达式中的括号分组,提取分组的数据 ss1 = '{"mobile_phone":"${admin_phone}","pwd":"#admin_pwd#"}' ress1 = re.search("(\$)\{(.*?)\}",ss).group(2) # $,{,}需要转译 print(ress1) # {admin_phone}
-
正则替换实例
import re
from com.myconf import conf
def replace_data(data): # 判断是否有需要替换的数据 while re.search("#(.+?)#", data): # .匹配任意字符,+重复一次或多次,?匹配0次或1次(变成非贪婪模式)()匹配分组:在匹配的数据中提取数据 key = re.search("#(.+?)#", data).group(0) # 字典的键 value = re.search("#(.+?)#", data).group(1) # 字典的值 try: data = data.replace(key, conf.get('test_info', value)) # 替换信息为配置文件conf.ini中的值 except: data = data.replace(key,getattr(TestData,value)) # 如果满足条件,且配置文件中没有配置数据,则读取临时变量的值 return data - 匹配手机号
import re #匹配手机号码:11位 re = r"1[3456789]\d{9}" # 第1位:1,第2位:3456789中的一个值,后9位匹配数字格式 res = re.findall(re)