栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【十八】Python全栈之路--正则函数

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【十八】Python全栈之路--正则函数

文章目录
    • 1. 反向引用_命名分组
    • 2. 正则函数

1. 反向引用_命名分组
# ### 反向引用
import re
strvar = "明天又要休息了"
obj = re.search("<(.*?)>(.*?)<(.*?)>",strvar)
print(obj)

# 获取匹配到的内容
res1 = obj.group()
print(res1)

# 获取分组里的内容
res2 = obj.groups()
print(res2)

# 反向引用的语法 1把第一个括号里面匹配到的内容在引用一次
obj = re.search(r"<(.*?)>(.*?)",strvar)
print(obj)
print(obj.group())
print(obj.groups())

strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(.*?)d(.*?)d(.*?)12",strvar)
print(obj)
print(obj.group())
print(obj.groups())


# ### 命名分组
"""
3) (?P<组名>正则表达式) 给这个组起一个名字
4) (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
"""
# 写法一
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(?P.*?)d(?P.*?)d(?P.*?)12",strvar)
print(obj)
print(obj.group())


# 写法二
strvar = " z3d4pzd a1b2cab "
obj = re.search(r"(?P.*?)d(?P.*?)d(?P.*?)(?P=tag1)(?P=tag2)",strvar)
print(obj)
print(obj.group())

2. 正则函数
# ### 正则函数
import re
# search   通过正则匹配出第一个对象返回,通过group取出对象中的值
strvar = "3+4 6*4"
obj = re.search(r"(d+[+*]d+)",strvar)
print(obj)

# 获取匹配到的内容
print(obj.group())
# 获取分组当中的内容 (返回元组)
print(obj.groups())

# match    验证用户输入内容 (了解)
"""search在正则表达式的前面加上^ 等价于 match ,其他用法上一模一样"""
strvar = "a17366668888"
strvar = "17366668888"
# obj = re.search(r"^d+",strvar)
# obj = re.match(r"d+",strvar)
# print(obj.group())
print(obj)


# split    切割
strvar = "alex|wusir_xboyww@risky"
lst = re.split("[|_@]",strvar)
print(lst)

strvar = "alex2341273894wusir234234xboyww11111risky"
lst = re.split("d+",strvar)
print(lst)


# sub      替换 
strvar = "alex|wusir_xboyww@risky"
"""
strvar = strvar.replace("|","&")
strvar = strvar.replace("_","&")
strvar = strvar.replace("@","&")
print(strvar)
"""
# sub(正则,替换的字符,原字符串[,替换的次数])
res = re.sub("[|_@]","&",strvar)
res = re.sub("[|_@]","&",strvar,1)
print(res)


# subn     替换  (用法上与sub相同,只是返回值不同)
res = re.subn("[|_@]","&",strvar)
res = re.subn("[|_@]","&",strvar,2)
print(res) 
# res = re.sub("[|_@]","&",strvar)
# ('alex&wusir&xboyww@risky', 2)

# finditer 匹配字符串中相应内容,返回迭代器
"""返回的是迭代器,迭代器中包含了对象 对象.group来获取匹配到的值"""
from collections import Iterator, Iterable
strvar = "sdf23647fdgdfg()*()*23423423"
it = re.finditer("d+",strvar)
print(isinstance(it,Iterator))

for obj in it:
	print(obj.group())


# compile  指定一个统一的匹配规则
"""
正常情况下,正则表达式编译一次,执行一次
为了避免反复编译,节省时间空间,可以使用compile统一规则
编译一次,终身受益
"""
strvar = "asdfs234sdf234"
pattern = re.compile("d+")

print("<===>")
obj = pattern.search(strvar)
print(obj.group())

lst = pattern.findall(strvar)
print(lst)

# 修饰符 
# re.I 使匹配对大小写不敏感
strvar = "大标题"
pattern = re.compile("(.*?)" , flags=re.I)
obj = pattern.search(strvar)
print(obj.group())


# re.M 使每一行都能够单独匹配(多行匹配),影响 ^ 和 $
"""单行独立匹配,而不是整体匹配"""
strvar = """

111

222 333 """ pattern = re.compile("^<.*?>(?:.*?)<.*?>$" , flags=re.M) lst = pattern.findall(strvar) print(lst) # re.S 使 . 匹配包括换行在内的所有字符 strvar = """ give sdfsdfmefive """ # 多个修饰符一起使用通过|拼接 pattern = re.compile(".*?mefive" , flags = re.S|re.I|re.M ) obj = pattern.search(strvar) print(obj.group())

小提示:

爬虫爬数据的时候用finditer,数据太大,用迭代器存
strvar = """

111

222 333 """ pattern = re.compile("^<.*?>(?:.*?)<.*?>$") lst = pattern.findall(strvar) print(lst) # 这里的结果为[] 因为.不匹配换行符,所以不会返回结果 pattern = re.compile("^<.*?>(?:.*?)<.*?>$",flags=re.M) 这里就是 一行的一行的匹配了 不会用for i in找思路 不会用.*?找思路
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/499253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号