Python-正则匹配

Python-正则匹配一、匹配单个字符:1、数字匹配\d表示匹配任意数字In[16]:ret=re.match(r"速度与激情\d","速度与激情1")In[17]

大家好,又见面了,我是你们的朋友全栈君。

一、匹配单个字符:

<span role="heading" aria-level="2">Python-正则匹配

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]: '速度与激情哈'
 

二、匹配多个字符

<span role="heading" aria-level="2">Python-正则匹配

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'

 

  • “.*” 和 “.+”的唯一区别就是.*也可以匹配空的,”.+”不可以
 

三、匹配开头与结尾

<span role="heading" aria-level="2">Python-正则匹配
练习1:匹配合法变量
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 非法变量名
变量名______ 符合要求..通过正则匹配出来的数据是______
 
练习2:匹配合法邮箱
# 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()

四、匹配分组

<span role="heading" aria-level="2">Python-正则匹配
 
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

  1. 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'
 
  1. findall匹配所有,并返回一个列表
In [104]: re.findall(r"\d+","阅读数为9999,下载数为8888")
Out[104]: ['9999', '8888']
 
  1. 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)
 
  1. 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']
  

六、贪婪与非贪婪

  1. “.*?”中的’?’表示非贪婪
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的作用

python中字符串前面加上 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账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号