每天一个正则表达式^.+

版权声明:欢迎交流,转载请注明出处。 https://blog.csdn.net/u013034226/article/details/82467594

目录

一、匹配单个字符

二、匹配多个字符

三、匹配开头和结尾

四、匹配分组

五、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$", "[email protected]")
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)

# ['丽丽,真的', '嘿嘿', '哈哈', '都能']

猜你喜欢

转载自blog.csdn.net/u013034226/article/details/82467594