学无止境!希望往后余生感恩今天的坚持!
活动地址:优快云21天学习挑战赛
昨天如蜗牛般学习了正则表达式的概念、用途、模式元素、优先运算符、加载re模块、调用re.match()函数并尝试使用该函数进行单字符匹配和多字符匹配(欢迎查阅Python入门之正则表达式-学习笔记(1)),收获颇丰。今天除继续学习多字符匹配,还将学习匹配开头和结尾、匹配分组等,期待充实的一天。
**
学习日记
**
一、正则表达式学习要点
6、re模块:Python中通过正则表达式对字符串进行匹配时常用的一个模块。(编号承接上一篇博文,下同。)
④匹配开头和结尾
# ^的用法, 匹配开头字符,但放在方括号内时表示匹配除方括号内的字符之外的字符。
>>> import re
>>> phone_numbers = ["13512345678","13412345678","13612345678","13566666666","13588888888"]
#正则表达式"^135[0-9]{8}"表示匹配以135开头的11位数字
>>> for phone_number in phone_numbers:
... result = re.match("^135{8}",phone_number)
... if result:
... print ("号码 %s 是联通号" % result.group())
... else:
... print("号码 %s 不是联通号" % phone_number)
# $的用法, 匹配结尾的字符
>>> email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
#正则表达式"[\w]{4,20}@163\.com$"表示以4到20位大小写字母、数字、下划线(\w)为邮箱地址的163.com为结尾的邮箱,\.中的反斜杠是对通配符.的转义。
>>> for email in email_list:
... ret = re.match("[\w]{4,20}@163\.com$", email)
... if ret:
... print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
... else:
... print("%s 不符合要求" % email)
...
xiaoWang@163.com 是符合规定的邮件地址,匹配后的结果是:xiaoWang@163.com
xiaoWang@163.comheihei 不符合要求
.com.xiaowang@qq.com 不符合要求
⑤匹配分组
>>> import re
# |的用法,管道符表示二者选一
#正则表达式“[1-9]?\d$|100"表示匹配0-99或100的数字,?表示要么1次要么没有
>>> result = re.match("[1-9]?\d$|100","9")
>>> print(result.group())
9
#()的用法,将括号中字符作为一个分组,括号内的字符也称为子模式。
#正则表达式"[\w]{4,20}@(163|126|qq)\.com$"表示由4到20位大小写字母、数字、下划线组成的邮箱地址并以.com结尾的163、126或qq邮箱
>>> for email in email_list:
... result = re.match("[\w]{4,20}@(163|126|qq)\.com$",email)
... if result:
... print("%s 是符合规定的邮件地址" % result.group())
... else:
... print("%s 不是163、126、qq邮箱" % email)
...
xiaoWang@163.com 是符合规定的邮件地址
xiaoWang@163.comheihei 不是163、126、qq邮箱
.com.xiaowang@qq.com 不是163、126、qq邮箱
xiaoWang@126.com 是符合规定的邮件地址
xiaoWang@qq.comheihei 不是163、126、qq邮箱
.com.xiaowang@126.com 不是163、126、qq邮箱
# \的用法,引用分组num匹配到的字符,但要使用元字符(r"")以防止\为转义符
#正则表达式"<[a-zA-Z]*>\w*</[a-zA-Z]*>"表示<大小写字母>字母数字下划线</大小写字母>,其中尖括号和正斜杠没有特殊含义
>>> result = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>","<html>hh</html>")
>>> print(result.group())
<html>hh</html>
# 一般认为第一对<>内是什么,第二对<>内也是什么,因此可以用分组匹配数据,但要使用元字符
#正则表达式r"<([a-zA-Z]*)>\w*</\1>"与"<[a-zA-Z]*>\w*</[a-zA-Z]*>"同义
>>> result = re.match(r"<([a-zA-Z]*)>\w*</\1>","<html>hh</html>")
>>> print(result.group())
<html>hh</html>
#\num 的用法
>>> labels = ["<html><h1>www.itcast.cn</h1></html>", "<html><h1>www.itcast.cn</h2></html>"]
#r"<(\w*)><(\w*)>.*</\2></\1>"中数值代表分组的顺序,即\1表示与第一个尖括号内的内容一致
>>> for label in labels:
... result = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
... if result:
... print("%s 是符合要求的标签" % result.group())
... else:
... print("%s 不符合要求" % label)
...
<html><h1>www.itcast.cn</h1></html> 是符合要求的标签
<html><h1>www.itcast.cn</h2></html> 不符合要求
# (?P<name>)分组起别名, (?P=name)引用别名为name的分组匹配到的字符串,必须联合使用
>>> result = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
>>> print(result.group())
<html><h1>www.itcast.cn</h1></html>
跟着【无 羡ღ】老师详细的讲解步骤一步步演练,倍感时光飞逝,但总能领会每一个知识点的强大,也在一步步演练中慢慢理解“人生苦短,我学Python”的真谛!
二、学习中遇到的问题
关于\num的用法,正则表达式r"<(\w*)><(\w*)>.*</\1></\2>"的\1、\2中的数字表示前面对应的尖括号的顺序吗?如果没有尖括号,还可以这样使用吗?
三、学习总结
在Python中进行爬取数据、文本检索、数据筛选时想必会经常用到分组匹配,尽管离爬取数据这些目标依然十分遥远,但学完今天的内容再面对爬取数据等这类问题似乎不再那么无措。坚持!