""" re模块各方法区别 search:若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个 findall:返回string中所有与pattern相匹配的全部字串,返回形式为数组。 finditer:返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。 """ import re # 需要匹配的字符串 string = '12abc45' result = re.search(pattern='abc', string=string) print(result) # 获取匹配到的子字符串 print(result.group()) result = re.search(pattern='2a', string=string) print(result) # .: 匹配任意字符, 除外 result = re.search(pattern='.', string=string) print(result) # [7a] 匹配7或者a string = '127bc45' result = re.search(pattern='[7a]', string=string) print(result) string = 'cccc' result = re.search(pattern='d', string=string) print(result) # *: 匹配某个字符零次->无限次 string = 'a7abc45' result = re.search(pattern='a*', string=string) print(result) # *: 匹配某个字符零次->无限次 # 贪婪模式 vs 非贪婪模式 # Python使用正则表达式:贪婪模式。 string = 'a7abc45' result = re.search(pattern='.*', string=string) print(result) # 启用非贪婪模式? string = 'a7abc45' result = re.search(pattern='.*?', string=string) print(result)
使用例子:
# 需要匹配 #mobile_phone# #pwd# string = '{"member_id":"#pwd#","amount":#money#}' import re # result = re.search('#.*?#', string) # print(result) # 分组 result = re.search('#(.*?)#', string) print(result) # result.group() 正则表达式匹配到的整个结果 print(result.group(0)) # #pwd# # result.group(1) :结果当中第一个括号里面的内容, # result.group(2), 第二个括号里面的内容 print(result.group(1))
封装示例:
string = '{"member_id":"#pwd#","amount":#money#}' class Data: pwd = '123456' money = 100 # 方法一:if # 方法二: 正则表达式 re.search, re.finditer import re result = re.finditer('#(.*?)#', string) for el in result: # el 匹配到的每个数据 # print(el.group()) # print(el.group(1)) # pwd # 字符串替换, replace old = el.group() # #pwd# prop_name = el.group(1) # pwd string = string.replace(old, str(getattr(Data, prop_name)) ) print(string) # 1, getattr() # 2, re.finditer() # 3, .*? # 4, group(), group(1)