python之正则

正则表达式:概念:用规则匹配到想要的信息

正则表达式 = 元字符 + 限定符

元字符匹配限定符匹配
.匹配人单个字符 数字 汉字 字母 符号 空格 都能匹配+匹配前一个字符出现1次或者无限次,即至少有1次
\d匹配任意单个数字?匹配前一个字符出现1次或者0次,即要么有1次,要么没有
\D匹配非数字,即不是数字.匹配人单个字符 数字 汉字 字母 符号 空格 都能匹配
[0-9]等价0-9*匹配0次或者多次,贪婪匹配
[ ]匹配[ ]中列举的字符{m}匹配前一个字符出现m次
\s匹配空白,即 空格,tab键{m,}匹配前一个字符至少出现m次
\S匹配非空白{m,n}匹配前一个字符出现从m到n次
\w匹配单词字符,即a-z、A-Z、0-9、_
\W匹配非单词字符
[a-z]等价所有的小写字母
[A-Z]等价所有的大写字母

正则表达式在python中的模块是内置的re模块:
一、例1:match方法,从头开始取值,取值找得到:返回对象,找不到:返回为None

re.match(pattern, string, flags) ;pattern是正则表达式,string需要匹配的字符串,flags为可选参数修饰符。

import re

# 匹配不到的话,返回值为None,其中www 是提取字段,S为取值对象
s = 'ww.lemfix.com'
res = re.match('www', s)  # match函数是从起始位置匹配的。如果起始位置匹配失败,则返回None
print(res)  # 返回为:None

例2:正则取值返回group对象值和value值

import re
# 匹配到的话,返回值对象 
w = 'www.lemfix.com'
res = re.match('www', w)
print(res)  # 返回匹配出来的对象类型信息等 <re.Match object; span=(0, 3), match='www'>
print(res.group(0))  # 返回值为www 返回匹配值分组 根据正则表达式里面的括号去分组 group()==group(0)

例3:正则表达式 字符*.* 代替所有的单一字符

import re

# 匹配任意字符开始的字符串
str = 'abc'
ret = re.match("..", str)
print(ret.group())  # ab.用两个..就表示只要str字符串开头是两个字符即可。
ret1 = re.match("....", str)  # 这种情况则会报错,因为str只有三个字符。

例4:不区分大小写

import re
 # match()函数适合匹配是否以xxxx开始的字符串,因为其从头开始匹配的
ret = re.match("abc", "aBCabc", re.I)  # 可选参数re.I表示忽略大小写。
print(ret.group())  # aBC
ret1 = re.match("abc", "aBCabc")
print(ret1.group())  # 'NoneType' object has no attribute 'group'

例5:正则表达式头匹配+分组(重点

import re

j = 'www.lemfix.com'
res = re.match('(w)(ww)', j)  # 正则表达式 分成了两组
print(res.group())  # group()==group(0) 是拿到匹配的全部字符,返回值:www ;
print(res.group(1))  # 返回值 :w
print(res.group(2))  # 返回值 :ww

二、1、例如:findall 首尾匹配:

import re

co = 'emonfixemon' # 正则表达式全(首尾)匹配
res = re.findall('emon', co)  # 返回的是列表
print(res)  # 返回值 : ['emon', 'emon']

res_1 = re.findall('(e)(mon)', co)
print(res_1)  # 返回值 : [('e', 'mon'), ('e', 'mon')]
print(res_1[0][0])  # 返回值 :e

例如:2、findall 全部匹配:
TXT文件中:匹配文章
tsn=SA223ASD1FGDGD2E
tsn=SA223ASD1FGDGD4E
tsn=SA223ASD1FGDGD3E
tsn=SA223ASD1FGDGD5E
tsn=SA223ASD1FGDGD6E

import re

result = re.findall('tsn=([0-9A-Za-z]*)', a.decode('utf-8'))  # 全部匹配
list1 = []
    for i in result:
        if i != '':
            print(i)
            list1.append(i)

三、例1:search :函数 扫描整个字符串并返回第一个成功的值,函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回为None

import re

z = "{'mobilephone': '${normal_tel}', 'pwd': '1234567'}"
res = re.search("\${(.+?)}", z)  # res = re.search("\$\{(.*?)\}", z) 两种写法都可以
print(res.group(0))  # 返回值 ${normal_tel}
print(res.group(1))  # 返回值 normal_tel

例2:先利用正则提取出需要替换的变量,再利用反射中取出数据,再利用字符串替换,把反射取出的数据替换变量。

import pandas as pd

class DataTel:  # 实际取出一串数据
	url = r'E:\wk\project\class_api_tow\test_data.xlsx'
	normal_tel = pd.read_excel(url, sheet_name='sheet', dtype={'normal_tel': str}).loc[0, ['normal_tel']].values[0]

# 另一py文件
import re
from class_api_tow.Tel import DataTel
z = "{'mobilephone': '${normal_tel}', 'pwd': '1234567'}" # 把${normal_tel} 替换成上面文件的值:139731368332
key = re.search("\${(.+?)}", z).group(0)  # key = ${normal_tel}
value = re.search("\${(.+?)}", z).group(1)  # value = normal_tel,取的是上面那个文件中的值 这样参数化有利于多次替换,在例2中举例就明白了
now_z = z.replace(key, str(getattr(DataTel, value)))  # 完成替换,注意getattr的用法 normal_tel 即是:139731368332
print(now_z)  # 返回值:{'mobilephone': '139731368332', 'pwd': '1234567'}

列2:完成参数化正则替换字符串

import pandas as pd

class DataTel:  # 实际取出一串数据
	url = r'E:\wk\project\class_api_tow\test_data.xlsx'
	normal_tel = pd.read_excel(url, sheet_name='sheet', dtype={'normal_tel': str}).loc[0, ['normal_tel']].values[0]
	pwd = '24324324'

# 另一py文件
import re
from class_api_tow.Tel import DataTel

a = "{'mobilephone': '${normal_tel}', 'pwd': '${pwd}'}"

# 多次替换
while re.search("\${(.+?)}", a):  # 判断为真True,那么就一直执行,其中 ${} 有两次,当两次完成之后为假false,不继续执行
    key = re.search("\${(.+?)}", a).group()
    value = re.search("\${(.+?)}", a).group(1)
    a = a.replace(key, str(getattr(DataTel, value)))
    print(key, value)
    print(a)

# 其中结果打印两次 
${normal_tel} normal_tel
{'mobilephone': '139731368332', 'pwd': '${pwd}'}  # 完成normal_tel替换
${pwd} pwd
{'mobilephone': '139731368332', 'pwd': '24324324'}  # 完成pwd替换

列2:完成参数化正则替换字符串类:

import re

class Dore():
    @staticmethod
    def do_re(a):
        while re.search("\${(.+?)}", a):
            key = re.search("\${(.+?)}", a).group()
            value = re.search("\${(.+?)}", a).group(1)
            a = a.replace(key, str(getattr(DataTel, value)))
        return a


if __name__ == '__main__':
    a = "{'mobilephone': '${normal_tel}', 'pwd': '${pwd}'}"
    res = Dore.do_re(a)
    print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值