#CSDN21天学习挑战赛#Python入门之正则表达式-学习笔记(2)

​学无止境!希望往后余生感恩今天的坚持!

活动地址:CSDN21天学习挑战赛

昨天如蜗牛般学习了正则表达式的概念、用途、模式元素、优先运算符、加载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中进行爬取数据、文本检索、数据筛选时想必会经常用到分组匹配,尽管离爬取数据这些目标依然十分遥远,但学完今天的内容再面对爬取数据等这类问题似乎不再那么无措。坚持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值