【蟒蛇】25、正则表达式-学Python黑马程序员个人笔记

  1. 参考视频
  2. 基础方法
  3. 元字符匹配

参考视频

黑马程序员python教程,8天python从入门到精通

基础方法

# 正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、
# 匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。
#
# 简单来说,正则表达式就是使用:字符串定义规则,并通过规则去验证字符串是否匹配。
# 比如,验证一个字符串是否是符合条件的电子邮箱地址,只需要配置好正则规则,即可匹配任意邮箱。
# 比如通过正则规则: (^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$)
# 即可匹配一个字符串是否是标准邮箱格式
#
# 但如果不使用正则,使用if else来对字符串做判断就非常困难了。
import re
#
# 正则的三个基础方法
# Python正则表达式,使用re模块,并基于re模块中三个基础方法来做正则匹配。
# 分别是:match、search、findall 三个基础方法
# re.match(匹配规则, 被匹配字符串)
# 从被匹配字符串开头进行匹配, 匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空。

s = 'python itheima python itheima python itheima'

result = re.match('python', s)
print(result)  # <re.Match object; span=(0, 6), match='python'>
print(result.span())  # (0, 6)
print(result.group())  # python

s = '1python itheima python itheima python itheima'

result = re.match('python', s)
print(result)  # None


"""
演示Python正则表达式re模块的3个基础匹配方法
"""

s = "1python itheima python python"
# match 从头匹配
result = re.match("python", s)
print(result)  # None
# print(result.span())
# print(result.group())
# search 搜索匹配

result = re.search("python", s)
print(result)  # <re.Match object; span=(1, 7), match='python'>
result = re.search("python2", s)
print(result)  # None
# findall 搜索全部匹配
result = re.findall("python", s)
print(result)  # ['python', 'python', 'python']

元字符匹配

# 在刚刚我们只是进行了基础的字符串匹配,正则最强大的功能在于元字符匹配规则。
# 单字符匹配:
# . -匹配任意1个字符(除了\n),\. 匹配点本身
# [] -匹配[]中列举的字符
# \d -匹配数字,即0-9
# \D -匹配非数字
# \s -匹配空白,即空格、tab键
# \S -匹配非空白
# \w -匹配单词字符,即a-z、A-Z、0-9、_
# \W -匹配非单词字符(特殊字符)
#
# 示例:
# 字符串 s = “itheima1@@python2!!666 ##itcast3”
# -找出全部数字: re.findall(r‘\d’, s)
# 字符串的r标记,表示当前字符串是原始字符串,即内部的转义字符无效而是普通字符
# -找出特殊字符:
# re.findall(r‘\W’, s)
# -找出全部英文字母:
# re.findall(r’[a-zA-Z]’, s)
# []内可以写:[a-zA-Z0-9] 这三种范围组合或指定单个字符如
# [aceDFG135]


import re

s = "itheima1 @@python2 !!666 ##itccast3"

result = re.findall(r'\d', s)  # 字符串前面带上r的标记,表示字符串中转义字符无效,就是普通字符的意思
print(result)  # ['1', '2', '6', '6', '6', '3']
result = re.findall(r'\W', s)
print(result)  # [' ', '@', '@', ' ', '!', '!', ' ', '#', '#']
result = re.findall(r'[a-zA-Z]', s)
print(result)  # ['i', 't', 'h', 'e', 'i', 'm', 'a', 'p', 'y', 't', 'h', 'o', 'n', 'i', 't', 'c', 'c', 'a', 's', 't']
result = re.findall(r'[0-9]', s)
print(result)  # ['1', '2', '6', '6', '6', '3']

# 数量匹配:
# * 匹配前一个规则的字符出现0至无数次
# + 匹配前一个规则的字符出现1至无数次
# ? 匹配前一个规则的字符出现0次或1次
# {m} 匹配前一个规则的字符出现m次
# {m,} 匹配前一个规则的字符出现最少m次
# {m,n} 匹配前一个规则的字符出现m到n次

# 边界匹配:
# ^ 匹配字符串开头
# $ 匹配字符串结尾
# \b 匹配一个单词的边界
# \B 匹配非单词边界

# 分组匹配:
# | 匹配左右任意一个表达式
# () 将括号中字符作为一个分组

# # 匹配账号,只能由字母和数字组成,长度限制6到10位
r = '^[0-9a-zA-Z]{6,10}$'
s = '123456Ab'
print(re.findall(r, s))  # ['123456Ab']
s = '123456_'
print(re.findall(r, s))  # []

# # 匹配QQ号,要求纯数字,长度5-11,第一位不为0
r = '[1-9][0-9]{4,10}'  # 只是子串
s = '012345678'
print(re.findall(r, s))  # ['12345678']
s = '12345678'
print(re.findall(r, s))  # ['12345678']

r = '^[1-9][0-9]{4,10}$'  # 整体
s = '012345678'
print(re.findall(r, s))  # []
s = '12345678'
print(re.findall(r, s))  # ['12345678']

# 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
# abc.efg.daw@qq.com.cn.eu.qq.aa.cc
# abc@qq.com
# {内容}.{内容}.{内容}.{内容}.{内容}.{内容}.{内容}.{内容}@{内容}.{内容}.{内容}
r = r'^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$'
# s = 'a.b.c.d.e.f.g@qq.com.a.z.c.d.e'
s = 'a.b.c.d.e.f.g@qq.com.a.z.c.d.e'
print(re.findall(r, s))  # [('.g', 'qq', '.e')]

r = r'(^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+$)'  # 整体的组
# s = 'a.b.c.d.e.f.g@qq.com.a.z.c.d.e'
s = 'a.b.c.d.e.f.g@qq.com.a.z.c.d.e'
print(re.findall(r, s))  # [('a.b.c.d.e.f.g@qq.com.a.z.c.d.e', '.g', 'qq', '.e')]
print(re.match(r, s))  # <re.Match object; span=(0, 30), match='a.b.c.d.e.f.g@qq.com.a.z.c.d.e'>

s = 'a.b.c.d.e.f.g@126.com.a.z.c.d.e'
print(re.match(r, s))  # None

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 3415226167@qq.com
资源 相册