正则表达式

正则表达式,第1张

正则表达式 1.什么是正则表达式

正则表达式不是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}

 注意:

  1. money是数值类型,所以使用replace替换时,一定要注意str()转换
  2. 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同名类属性,不然会报错,不想报错可以把这行代码修改为


 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5070802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存