大家好,又见面了,我是你们的朋友全栈君。
一、匹配单个字符:
1、数字匹配
- \d表示匹配任意数字
In [16]: ret = re.match(r"速度与激情\d","速度与激情1")
In [17]: ret.group()
Out[17]: '速度与激情1'
- [8]表示只匹配数字8
In [6]: ret = re.match(r"速度与激情[8]","速度与激情8")
In [7]: ret.group()
Out[7]: '速度与激情8'
- [1-8] 表示匹配1-8之间任意一个数字
In [8]: ret = re.match(r"速度与激情[1-8]","速度与激情8")
In [9]: ret.group()
Out[9]: '速度与激情8'
- [1-38-9]表示只匹配数字1-3之间、8-9之间任一个数字
In [14]: ret = re.match(r"速度与激情[1-38-9]","速度与激情3")
In [15]: ret.group()
Out[15]: '速度与激情3'
In [12]: ret = re.match(r"速度与激情[1-38-9]","速度与激情5")
In [13]: ret.group()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-13-0c062bb84e23> in <module>
----> 1 ret.group()
AttributeError: 'NoneType' object has no attribute 'group'
2、数字 + 字母 匹配
- [1-8a-zA-Z] 表示匹配1-8之间、a-z之间、A-Z之间任意一个字符
In [20]: ret = re.match(r"速度与激情[1-8a-zA-Z]","速度与激情a")
In [21]: ret.group()
Out[21]: '速度与激情a'
In [22]: ret = re.match(r"速度与激情[1-8a-zA-Z]","速度与激情A")
In [23]: ret.group()
Out[23]: '速度与激情A'
- \w 等同于[1-8a-zA-Z] , 表示匹配1-8之间、a-z之间、A-Z之间任意一个字符,还包括中文,缺点:范围太宽广
In [28]: ret = re.match(r"速度与激情\w","速度与激情哈")
In [29]: ret.group()
Out[29]: '速度与激情哈'
二、匹配多个字符
1、表示位数符{},只匹配紧挨着的字符
- r”\d{3}” 表示可以匹配三位数字,中间不能插入其它字符
In [30]: ret = re.match(r"速度与激情\d{1,3}","速度与激情22")
In [31]: ret.group()
Out[31]: '速度与激情22' #匹配1到3位数,结果全部匹配
In [32]: ret = re.match(r"速度与激情\d{1}","速度与激情22") #只匹配一位,结果只匹配部分
In [33]: ret.group()
Out[33]: '速度与激情2'
- r”.*” 表示匹配任意字符,也可匹配空,但”.”不能匹配换行部分
In [41]: html_content = """fdsafdfdsafdsafdsa43214321432
...: fdsafdsafds范德萨范德萨
...: fdsafdsa tretrewtrew"""
#匹配单行
In [43]: ret = re.match(r".*",html_content)
In [44]: ret.group()
Out[44]: 'fdsafdfdsafdsafdsa43214321432' #未匹配换行部分
#匹配空
In [45]: ret = re.match(r".*","")
In [46]: ret.group()
Out[46]: ''
#匹配换行
In [47]: ret = re.match(r".*",html_content,re.S)
In [48]: ret.group()
Out[48]: 'fdsafdfdsafdsafdsa43214321432\nfdsafdsafds范德萨范德萨\nfdsafdsa tretrewtrew'
- “.*” 和 “.+”的唯一区别就是.*也可以匹配空的,”.+”不可以
三、匹配开头与结尾
In [69]: In [65]: names = ["age","_age","1age","age1","a_age","age!","a#123","______"]
In [71]: for name in names:
...: ret = re.match(r"^[a-zA-Z_][0-9a-zA-Z_]*$",name) # $表示一直匹配到结尾,^表示从紧挨着该符号的字符为开头,python中match默认从开头开始
...: if ret:
...: print("变量名%s 符合要求..通过正则匹配出来的数据是%s"%(name, ret.group()))
...: else:
...: print("变量名%s 非法变量名"% name)
...:
...:
...:
...:
...:
变量名age 符合要求..通过正则匹配出来的数据是age
变量名_age 符合要求..通过正则匹配出来的数据是_age
变量名1age 非法变量名
变量名age1 符合要求..通过正则匹配出来的数据是age1
变量名a_age 符合要求..通过正则匹配出来的数据是a_age
变量名age! 非法变量名
变量名a#123 非法变量名
变量名______ 符合要求..通过正则匹配出来的数据是______
# coding: utf-8
import re
def main():
email = input("请输入邮箱地址: ")
#如果在正则表达式中需要用到了某些普通的字符,比如. 比如?,仅仅需要在他们前面添加一个反斜杠进行转义
ret = re.match(r"[a-zA-Z0-9_]{4,20}@163\.com$", email)
if ret:
print("%s符合要求" % email)
else:
print("%s不符合要求" % email)
if __name__ == '__main__':
main()
四、匹配分组
In [78]: ret = re.match(r"([a-zA-Z0-9_]{4,20})@(163|126)\.com","zhangsan@126.com")
In [79]: ret.group(1) #group(1) 即([a-zA-Z0-9_]{4,20})匹配到的内容
Out[79]: 'zhangsan'
In [80]: ret.group(2) #group(2)即(163|126)匹配到的内容,其它 | 表示或者
Out[80]: '126'
In [90]: ret = re.match(r"<(\w*)>.*</\1>","<h1>abcefweq</h1>") #后面的\1表示与(\w*)分组里的内容一致
In [92]: ret.group()
Out[92]: '<h1>abcefweq</h1>'
五、re模块的高级用法search、findall、sub、split
- search与match不一样,match默认从头开始匹配,search默认只匹配第一位
In [101]: re.search(r"\d+","阅读数为9999").group()
Out[101]: '9999'
In [102]: re.search(r"\d+","阅读数为9999,下载数为8888").group() #这里有两个数字,search只匹配出一位
Out[102]: '9999'
- findall匹配所有,并返回一个列表
In [104]: re.findall(r"\d+","阅读数为9999,下载数为8888")
Out[104]: ['9999', '8888']
- sub替换,re.sub(pattern=匹配规则,repl=替换值,也可以是函数,string=要匹配的字符串)
#需求:提取以下html中的中文
In [94]: html_content = """<dd class="job_bt"><h3 class="description">职位描述:</h3><div class="job-detail">JD:
...: <br>1. 参与产品测试的全流程,包括参与需求分析、设计评审,制定测试计划,设计和执行测试用例,分析总结产品的测试结果,推动问题的解决,提高最终的交付质量;
...: <br>2. 参与适用于产品需要的性能测试工具/框架开发,性能测试用例设计、执行,自动构建测试环境,持续集成等;
...: <br>3. 保证被测系统的质量与性能,并通过测试流程和方法创新,持续改进提高测试团队的测试覆盖度和测试工作效率。
...: <br>
...: <br>岗位要求
...: <br>1. 计算机、通信、网络等相关专业背景,有计算机视觉产品或云服务产品测试经验优先;
...: <br>2. 熟悉Linux系统,熟悉shell脚本语言;熟悉java或groovy或python;
...: <br>3. 熟悉Docker,Jmeter,Prometheus,Grafana等开源工具
...: <br>4. 具备测试领域系统化的知识结构,熟悉完整测试环节,能独立完成功能测试、接口测试、UI自动化测试集成测试以及接口性能测试;
...: <br></div></dd>"""
In [99]: re.sub(r"<[^>]*>|\s","",html_content) #[^>]表示匹配不是>的 '|\s'表示或匹配空白字符,\n
Out[99]: '职位描述:JD:1.参与产品测试的全流程,包括参与需求分析、设计评审,制定测试计划,设计和执行测试用例,分析总结产品的测试结果,推动问题的解决,提高最终的交付质量;2.参与提高测试团队的测试覆盖度和测试工作效率。岗位要求1.计算机、通信、网络等相关专业背景,有计算机视觉产品或云服务产品测试经验优先;2.熟悉Linux系统,熟悉shell脚本语言;熟悉java或groo,能独立完成功能测试、接口测试、UI自动化测试集成测试以及接口性能测试;'
# coding: utf-8
import re
def add(temp):
strNum = temp.group()
num = int(strNum) + 1
return str(num)
ret = re.sub(r"\d+", add, "python = 997")
print(ret)
ret = re.sub(r"\d+", add, "python = 99")
print(ret)
- split根据匹配进行切割字符串,并返回一个列表
#需求:切割出字符,去掉特殊字符和所有空格
In [113]: re.split(r":| ","info:xiaoZhang 33 shanghai") #以: 或者两个空格切割,如果字符中有一个空白字符
Out[113]: ['info', 'xiaoZhang', '33', 'shanghai']
#匹配1个或者2个空格
In [115]: re.split(r":| {1,2}","info:xiaoZhang 33 shanghai alone")
Out[115]: ['info', 'xiaoZhang', '33', 'shanghai', 'alone']
六、贪婪与非贪婪
- “.*?”中的’?’表示非贪婪
In [120]: re.sub(r"<.*?>|\s","",html_content)
Out[120]: '职位描述:JD:1.参与产品测试的全流程,包括参与需求分析、设计评审,制定测试计划,设计和执行测试用例,分析总结产品的测试结果,推动问题的解决,提高最终的交付质量;2.参与进提高测试团队的测试覆盖度和测试工作效率。岗位要求1.计算机、通信、网络等相关专业背景,有计算机视觉产品或云服务产品测试经验优先;2.熟悉Linux系统,熟悉shell脚本语言;熟悉java或gr节,能独立完成功能测试、接口测试、UI自动化测试集成测试以及接口性能测试;'
- + 至少一个 条件成立取的越多越好,即贪婪
- * 可以0个,也可以任意一个 条件成立取的越多越好,即贪婪
- ? 可以没有,也可以一个
- {1,3} 1到3个
- 加 ?表示条件成立情况下取得越少越好,即把贪婪变成非贪婪
- +? 取一个
- *? 可以不取
- ?? 可以不取
- {1,3} 可以取1个
七、r的作用
In [121]: ret = re.match(r"c:\\a","c:\\a\\b\\c")
In [122]: ret.group()
Out[122]: 'c:\\a'
八、匹配特殊符号:方括号[ ] 需在括号之前添加转义符 “\”
in:
log = "2021-12-28 15:49:54,735 ERROR [pool-8-thread-1] init.JStackDumpTask : Error dump jstack info"
error_pattern = re.sub(r"\d{4}(.*)\d{3}|(\[.*])", "", log)
print(error_pattern)
out:
ERROR init.JStackDumpTask : Error dump jstack info
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155456.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...