目录
五、re模块的高级用法:search,findall,sub,split
一、匹配单个字符
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
\W 匹配特殊字符,即非字母、非数字、非汉字
import re
# .匹配任意一个字符,除了\n
match1 = re.match("kk.ty", "kk8ty")
if match1:
print(match1.group())
else:
print("失败")
# =>kk8ty
# [aD]只匹配目标的第一个字符
match1 = re.match("[aD]", "tDt")
if match1:
print(match1.group())
else:
print("失败")
# =>失败
# [0-9]匹配0-9中的一个数字
match1 = re.match("[0-9]", "666555")
if match1:
print(match1.group())
else:
print("失败")
# => 6
# \d匹配数字0-9
match1 = re.match("\d", "9d")
if match1:
print(match1.group())
else:
print("失败")
# =>9
# \D匹配不是数字,依然是第一个
match1 = re.match("\D", "g0y")
if match1:
print(match1.group())
else:
print("失败")
# =>g
# \s匹配空白字符空格和tab,但是一个空格或一个tab
match1 = re.match("葫芦娃\s[12]", "葫芦娃 2")
if match1:
print(match1.group())
else:
print("失败")
#=>葫芦娃 2
# \S匹配非空白字符,一个
match1 = re.match("1\S2", "1^2")
if match1:
print(match1.group())
else:
print("失败")
#=> 1^2
# [a-zA-Z0-9_] :表示字母数字下划线
# \w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
match1 = re.match("\w", "g0y")
if match1:
print(match1.group())
else:
print("失败")
=> g
\W 匹配除了即a-z、A-Z、0-9、_、汉字的特殊字符
match1 = re.match("\W", "$#&^*")
if match1:
print(match1.group())
else:
print("失败")
=> $
二、匹配多个字符
* 前一个字符0-无穷次
+ 前一个字符1-无穷次
? 前一个字符0(无)次或有一次
{m}前一个字符m次
{m,n}前一个字符m到n次
# * 匹配前一个字符出现0次或者无限次
match_obj = re.match("t.*o", "tasdfasdfol")
if match_obj:
# 获取匹配结果
print(match_obj.group())
else:
print("匹配失败")
# => tasdfasdfo
# + 匹配前一个字符出现1次或者无限次,若一个都没有,则不匹配
match_obj = re.match("t.+o", "t654654o")
if match_obj:
# 获取匹配结果
print(match_obj.group())
else:
print("匹配失败")
# => t654654o
# ? 匹配前一个字符出现0次或者1次
match_obj = re.match("t?o", "to")
if match_obj:
# 获取匹配结果
print(match_obj.group())
else:
print("匹配失败")
# => to
# {m} 匹配前一个字符出现m次
match_obj = re.match("t.{8}o", "tasdfasdfo")
if match_obj:
# 获取匹配结果
print(match_obj.group())
else:
print("匹配失败")
# => tasdfasdfo
# {m,n} 匹配前一个字符出现m-n次
match_obj = re.match("t.{6,8}o", "ta666asdfo")
if match_obj:
# 获取匹配结果
print(match_obj.group())
else:
print("匹配失败")
# => tasdfasdfo
三、匹配开头和结尾
# ^ 匹配字符串开头
# $ 匹配字符串结尾
# [^指定字符]: 表示除了指定字符都匹配
# 匹配以数字开头
match_obj = re.match("^\d.*", "6dsf")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
#=> 6dsf
# 匹配以数字结尾
match_obj = re.match(".*\d$", "kljgdsf6")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
#=> kljgdsf6
# 结尾匹配除了4,7之外的
match_obj = re.match(".*[0-35-68-9]$", "dsff3")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
#=> dsff3
# [^47] : 除了指定字符4.7,都匹配
match_obj = re.match(".*[^47]$", "dsflkjhhjg")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
=> dsflkjhhjg
# 匹配以数字开头中间内容是任意数据以数字结尾
match_obj = re.match("^\d.*\d$", "4dsf4")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
#=> 4dsf4
# 反斜杠\. : 表示作为普通点使用
catch = re.match("[0-9a-zA-Z]{4,20}@163\.com$", "6568999@163.com66")
if catch:
print(catch.group())
else:
print("匹配失败")
#=> 匹配失败(同时校验用户输入的内容是否是正确的邮箱)
# 匹配手机号,加上$符号更加严谨,避免了出现匹配到多于11位的手机号
catch_obj = re.match("1[3-9][0-9]{9}$", "18688889999")
if catch_obj:
print(catch_obj.group())
else:
print("失败")
#=> 18688889999
# 用[^#] 把范围限制到前两个#中间
match_obj = re.match("#[^#]+#", "#幸福是奋斗#出来的#")
if match_obj:
print(match_obj.group())
else:
print("匹配失败")
#=> #幸福是奋斗#
四、匹配分组
# | 匹配左右任意一个表达式
# (ab) 将括号中字符作为一个分组
# \num 引用分组num匹配到的字符串
# (?P<name>) 分组起别名
# (?P=name) 引用别名为name分组匹配到的字符串
# |匹配左右任意一个表达式
my_list = ["哈密瓜", "开心果", "馕", "羊肉串"]
for a in my_list:
match_obj = re.match("馕|羊肉串", a)
if match_obj:
print("想吃", match_obj.group())
else:
print("不想吃%s" % a)
# 不想吃哈密瓜
# 不想吃开心果
# 想吃 馕
# 想吃 羊肉串
# 提取出来qq文字和qq号码
match_obj = re.match("(qq:)([1-9]\d{4,10})", "qq:10345")
# 提示: 分组是按照从左到右依次排序的,默认最左边的是第1个分组
# 从1开始
if match_obj:
print(match_obj.group(1))
print(match_obj.group(2))
else:
print("匹配失败")
# qq:
# 10345
五、re模块的高级用法:search,findall,sub,split
# search : 根据正则表达式查找指定数据, 提示:只查找一次
search_obj = re.search("\d+", "家里7口人,1只小狗")
if search_obj:
print(search_obj.group(),type(search_obj.group()))
else:
print("失败")
# 7 <class 'str'>
# findall: 根据正则表达式查找指定数据, 提示:可以查找多个,返回一个列表
result = re.findall("\d+", "苹果10个 鸭梨5个")
print(result)
# ['10', '5']
# sub:根据正则表达式替换,不指定的话,默认count= 0,全部替换,
re1 = re.sub("\d+", "199", "我有0个桃子,1个西dua", count=1)
print(re1)
# 我有199个桃子,1个西dua
#split:根据正则表达式分割,只要正则表达式中有的,就都进行分割
# 默认maxsplit = 0全部分割,=1:只分割一次
my_str = "丽丽, 真的: 嘿嘿. 哈哈: 都能"
result1 = re.split("\.|:", my_str,)
print(result1)
# ['丽丽,真的', '嘿嘿', '哈哈', '都能']