正则表达式不是python中的一个概念,而是计算机的一概念,几乎所有的编程语言(java,python等)都支持正则表达式
正则表达式是字符串的模糊匹配技术(基于一个规则去匹配字符串当中的内容)
只要是想在字符串中找符合规律的子字符串,基本上都可以使用正则表达式
2.正则表达式的语法 2.1表示单字符 2.2表示数量 2.正则表达式在python中的应用re模块,是python的一个标准模块,是不需要安装的,直接导入即可
import re # pattern表示正则表达式(匹配规则) string表示一个字符串 string = 'n12abc45' result = re.search(pattern='abc', string=string) print(result) # 获取匹配到的子字符串 print(result.group()) result = re.search(pattern='2a', string=string) print(result) # .:表示匹配任意字符,n除外 result = re.search(pattern='.', string=string) print(result) # [7a]:表示匹配7或a,找到一个就不管其他符合条件的了 result = re.search(pattern='[7a]', string=string) print(result) # d:表示匹配数字0-9 result = re.search(pattern='d', string=string) print(result)
运行结果:
abc
span=(3, 6)表示匹配到子字符串的索引位置
match='abc'表示正则表达式的规则,也就是要匹配的子字符串
import re # *:表示匹配某个字符0次或无限次 # 贪婪模式 VS 非贪婪模式,python默认为贪婪模式 string = 'aa1111' result = re.search(pattern='1*', string=string) print(result) string = '7aabc45' result = re.search(pattern='7*', string=string) print(result) # 非贪婪模式 string = 'aa7aabc45' result = re.search(pattern='.*?', string=string) print(result) # 贪婪模式 result = re.search(pattern='.*', string=string) print(result)
运行结果:
None
import re string = '{"member_id": "#member_id#","amount":# "200"#}' result = re.search('#.*#', string) print(result) # 匹配#member_id# result = re.search('#(.*?)#', string) print(result) # 分组 # result.group()表示正则表达式匹配到的整个结果,默认是0 print(result.group(0)) # result.group(1)表示结果当中第一个括号里面的内容 # result.group(2)表示结果当中第二个括号里面的内容,此处没有第二个会报错 print(result.group(1)) print(result.group(2))
运行结果:
实践演练(正则替换代码):
re.search:每次只找一个匹配到的字符串,找到一个就不管其他的
re.finditer:找到所有匹配到的字符串
import re string = '{"member_id": "#member_id#","amount":#money#}' class data: member_id = '1234' money = 1000 # 方法一:if判断 if '#member_id#' in string: string = string.replace('#member_id#', Data.member_id) if '#money#' in string: string = string.replace('#money#', str(Data.money)) print(string) # 方法二:正则表达式re.finditer,匹配所有符合规则的字符串 result = re.finditer('#(.*?)#', string) for i in result: # i是匹配到的每个数据 old = i.group() # #member_id# new = i.group(1) # member_id string = string.replace(old, str(getattr(Data, new))) print(string)
运行结果:
{"member_id": "1234","amount":1000}
{"member_id": "1234","amount":1000}
注意:
- money是数值类型,所以使用replace替换时,一定要注意str()转换
- getattr(类名称,'属性名') 因为new正好是字符串,所以属性名不需要再加引号包裹
总结:
从结果中可以看到两种方法的结果是一样的,但当需要替换的内容较多时,使用方法二就比较方便
封装代码:
import re class data: member_id = '1234' money = 1000 def replace_data(string): result = re.finditer('#(.*?)#', string) for i in result: # i是匹配到的每个数据 old = i.group() # #member_id# new = i.group(1) # member_id string = string.replace(old, str(getattr(Data, new))) return string if __name__ == '__main__': string = '{"member_id": "#member_id#","amount":#money#}' result = replace_data(string) print(result)
注意:如果想替换token,那就必须要在Data类里添加token同名类属性,不然会报错,不想报错可以把这行代码修改为
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)