python中的正则表达式
在python中用正则表达式对字符串进行匹配的时候可用使用re模块
首先需要导入re模块: import re
使用过程如下:
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()
1、单字符匹配
注意:[]不管中括号里面有多少东西,但都是匹配一个
示例:
re.match(r"[hH]ello", "Hello world")
ret = re.match(r"速度与激情\d", "速度与激情8")
ret.group()
re.match(r"速度与激情[1-8]", "速度与激情3")
re.match(r"速度与激情[1-8abcd]", "速度与激情8").group()
re.match(r"速度与激情.", "速度与激情A").group()
2、匹配多个字符
示例:
re.match(r"\d{11}", "12345678901").group() #匹配11位数字
re.match(r"021-\d{8}", "021-12345678").group()#匹配带_的数字号码
re.match(r"021-?\d{8}", "02112345678").group() #匹配_可有可无的电话号码
re.match(r"\d{3,4}-?\d{7,8}", "0532-1234567").group() #匹配_前可三位可四位,_后可7位可8位的电话号码
3、匹配开头结尾
示例:
匹配邮箱
re.match(r"[a-zA-Z0-9_]{4,20}@163.com", "[email protected]") #错误的,如
# [email protected] 仍匹配成功
re.match(r"[a-zA-Z0-9_]{4,20}@163.com$", "[email protected]") #匹配到结尾,就可以排除如
# [email protected] 这类错误
#如果在正则表达式中需要用到某些普通的字符,比如 . ? 等,仅仅需要在他们前面添加一个反斜杠进行转义
re.match(r"[a-zA-Z0-9_]{4,20}@163\.com$","[email protected]")
示例:判断变量是否符合要求
import re
def main():
names = ["age", "_age", "1age", "age1", "a_age", "age_1_", "age!", "a#123", "__________"]
for name in names:
# ret = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*", name)
# ^规定开头 $规定结尾
# python中的match默认是从头开始判断的所以,在match中可以不写^,但是match不会判断结尾,所以
# 当需要以xxx结尾的时候 还需要写上$
ret = re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$", name)
if ret:
print("变量名:%s 符合要求....通过正则匹配出来的数据是:%s" % (name, ret.group()))
else:
print("变量名:%s 不符合要求...." % name)
if __name__ == "__main__":
main()
4、匹配分组
示例1:匹配0-100之间的数字
ret = re.match("[1-9]?\d$|100","8")
print(ret.group()) # 8
ret = re.match("[1-9]?\d$|100","78")
print(ret.group()) # 78
ret = re.match("[1-9]?\d$|100","08")
# print(ret.group()) # 不是0-100之间
ret = re.match("[1-9]?\d$|100","100")
print(ret.group()) # 100
示例2:匹配163、126邮箱
re.match(r"([a-zA-Z0-9_]{4,20})@(163|126)\.com$","[email protected]").group(1)
#如果想取第一个括号里匹配成功后的东西则group(1),如果想取第二个括号里面的东西则group(2)
这就是分组
示例3:给分组取别名
html_str = "<body><h1>hahahah</h1></body>"
re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>", html_str).group()
5、re模块的高级用法
(1)search
search功能与match功能的区别就是:search不用从头开始匹配。返回的是第一个匹配到的内容
re.search(r"\d+", "阅读次数为 9999, 点赞数为:100").group() # 9999
(2)findall
findall是直接返回匹配到的所有内容
#coding=utf-8
import re
ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
运行结果:[9999,7890,12345]
(3)sub 将匹配到的数据进行替换
re.sub(r"\d+", '998', "python = 997") # python=998
示例:将匹配到的阅读次数+1
#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") # python = 998
print(ret)
ret = re.sub(r"\d+", add, "python = 99") # python = 100
print(ret)
(4)split根据匹配进行切割字符串,并返回一个列表
需求:切割字符串“info:xiaoZhang 33 shandong”
#coding=utf-8
import re
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
运行结果:
['info', 'xiaoZhang', '33', 'shandong']
练习题
匹配里面的文本
html_str = """
<dd class="job_bt">
<h3 class="description">职位描述:</h3>
<div>
<p>职位诱惑:<br>机器学习相关项目,完全新技术驱动,互联网公司,工作氛围好,扁平管理,有技术大牛带<br><br>职位描述:<br>配合架构师和机器学习专家,完成项目的编码、测试和上线。<br><br>我们期望:<br>1. 211院校计算机相关专业本科以上学历;<br>2. 有扎实的编程和计算机基础,熟悉常用算法和数据结构。<br>3. 具有很强的问题解决能力,综合知识(或者通过搜索能快速掌握知识)强,了解前端、网络、多线程、数据库、Web开发等知识。<br>4. 2年以上工作经验(Python或者JAVA方向,如果编程能力特别过硬可以放开语言要求);<br><br>工作内容:<br>1. 根据业务需求进行需求分析和代码编写;<br>2. 结合系统实现对代码进行充分的自测,以及配合测试工程师联合进行测试;<br>3. 配合机器学习算法专家进行代码编写</p>
</div>
</dd>
"""
re.sub(r"<[^>]*>|\s", "", html_str)
re.sub(r"<[^>]*>|\s| ", "", html_str)