正则表达式:概念:用规则匹配到想要的信息
正则表达式 = 元字符 + 限定符
元字符 | 匹配 | 限定符 | 匹配 |
---|---|---|---|
. | 匹配人单个字符 数字 汉字 字母 符号 空格 都能匹配 | + | 匹配前一个字符出现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)