正则表达式不是python中的一个概念,而是计算机的一概念,几乎所有的编程语言(java,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}
注意:
总结:
从结果中可以看到两种方法的结果是一样的,但当需要替换的内容较多时,使用方法二就比较方便
封装代码:
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同名类属性,不然会报错,不想报错可以把这行代码修改为