【Python高级】详解 正则表达式(re模块)

概述

1. 正则表达式的介绍

在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:邮箱、图片地址、手机号码等,这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。

2. 正则表达式概念

正则表达式就是记录文本规则的代码

3. 正则表达式的样子

0\d{2}-\d{8} 这个就是一个正则表达式,表达的意思是匹配的是座机号码

4. 正则表达式的特点

  • 正则表达式的语法很令人头疼,可读性差
  • 正则表达式通用行很强,能够适用于很多编程语言

re 模块介绍

1. re模块的介绍

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个 re 模块

# 导入re模块
import re

# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)

# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

2. re模块的使用

import re

# 使用match方法进行匹配操作
result = re.match("it","it.cn")
# 获取匹配结果
info = result.group()
print(info)

运行结果:

it
  • re.match() 根据正则表达式从头开始匹配字符串数据

匹配单个字符

import re
# .	匹配任意1个字符(除了\n)
# [ ]	匹配[ ]中列举的字符
# \d	匹配数字,即0-9
# \D	匹配非数字,即不是数字
# \s	匹配空白,即 空格,tab键
# \S	匹配非空白
# \w	匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
# \W	匹配特殊字符,即非字母、非数字、非汉字、非下划线

# .	匹配任意1个字符(除了\n)
# 1. 正则表达式
# 2. 要匹配的字符串
# match_obj返回匹配对象
match_obj = re.match("t.o", "t\no")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

# 1. 正则表达式
# 2. 要匹配的字符串
# match_obj返回匹配对象
# [ ]	匹配[ ]中列举的字符
match_obj = re.match("葫芦娃[12]", "葫芦娃1")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

# 匹配银行卡密码中的其中一位
match_obj = re.match("[0123456789]", "7")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

match_obj = re.match("[0-9]", "7")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

# \d = > [0-9]= >[0123456789]
match_obj = re.match("\d", "7")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")


# \D: 匹配一个非数字字符
match_obj = re.match("\D", "a")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

# \s: 匹配一个空白字符,空格或者tab键\t
match_obj = re.match("葫芦娃\s[12]", "葫芦娃 1")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")


match_obj = re.match("葫芦娃\S[12]", "葫芦娃+1")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print("没空白的匹配:", result)
else:
    # 匹配失败match_obj是一个None
    print("没空白的匹配:匹配失败")

# 匹配某网站中密码的其中一位,密码是由字母、数字、下划线组成
match_obj = re.match("[a-zA-Z0-9_]", "_")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

# \w: 匹配一个字母、数字、下划线、汉字
match_obj = re.match("\w", "哈")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")

# \W: 匹配一个非字母、非数字、非下划线、非汉字的字符
match_obj = re.match("\W", "%")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    # 匹配失败match_obj是一个None
    print("匹配失败")
    
匹配失败
葫芦娃1
7
7
7
a
葫芦娃 1
没空白的匹配: 葫芦娃+1
_
哈
%

匹配多个字符

# *	匹配前一个字符出现0次或者无限次,即可有可无
# +	匹配前一个字符出现1次或者无限次,即至少有1次
# ?	匹配前一个字符出现1次或者0次,即要么有1次,要么没有
# {m}	匹配前一个字符出现m次
# {m,n}	匹配前一个字符出现从m到n次
import re

# 1. 正则表达式
# 2. 要匹配的字符串
# *	匹配前一个字符出现0次或者无限次,即可有可无
match_obj = re.match("t.*o", "to")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# + 匹配前一个字符串至少出现一次
match_obj = re.match("t.+o", "trsdfo")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# ?: 匹配前一个字符串出现0次或者1次
match_obj = re.match("https?", "http")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# {m}: 匹配前一个字符串必须出现m次
match_obj = re.match("ht{2}p", "http")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# {m, n}: 匹配前一个字符串最少出现m次,最多出现n次
match_obj = re.match("ht{1, 3}p", "httttp")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# 扩展: {m, }:匹配前一个字符串至少出现m次
match_obj = re.match("ht{2,}p", "htttttp")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

to
trsdfo
http
http
匹配失败
htttttp
  • *表示匹配前一个字符出现0次或者无限次,即可有可无
  • +表示匹配前一个字符出现1次或者无限次,即至少有1次
  • ?表示匹配前一个字符出现1次或者0次,即要么有1次,要么没有
  • {m}表示匹配前一个字符出现m次
  • {m,n}表示匹配前一个字符出现从m到n次

匹配开头和结尾

1. 匹配开头和结尾

代码 功能
^ 匹配字符串开头
$ 匹配字符串结尾
# ^	匹配字符串开头
# $	匹配字符串结尾

import re

# 1. 正则表达式
# 2. 要匹配的字符串
match_obj = re.match("^\d.*", "1abc")  # * 0次或无限次
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")


# 1. 正则表达式
# 2. 要匹配的字符串
match_obj = re.match(".*\d$", "aa3")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")


# 1. 正则表达式
# 2. 要匹配的字符串
match_obj = re.match("^\d.*\d$", "2asdfa3")  # 开头数字结尾数字
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# [^指定字符] 表示除了指定字符都匹配

# [^47] 除了4和7都匹配
# ^: 表示以指定字符串开头
# [^]: 表示除了指定字符串都匹配
match_obj = re.match("^\d.*[^47]$", "2asdfaa")
if match_obj:
    # 获取匹配结果
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

1abc
aa3
2asdfa3
2asdfaa

匹配分组

1. 匹配分组相关正则表达式

代码 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
# |	匹配左右任意一个表达式
# (ab)	将括号中字符作为一个分组
# \num	引用分组num匹配到的字符串
# (?P<name>)	分组起别名
# (?P=name)	引用别名为name分组匹配到的字符串

import re

# 水果列表
fruit_list = ['apple', 'banana', 'orage', 'pear', 'peach']

for value in fruit_list:
    # 根据每一个字符串,使用正则表达式进行匹配
    # |	匹配左右任意一个表达式
    match_obj = re.match("banana|pear", value)

    if match_obj:
        result = match_obj.group()
        print("我想吃的水果:", result)
    else:
        print("我不想吃的水果:", value)


# 匹配出163、126、qq等邮箱
# \.: 表示对正则表达式里面的.进行了转义,变成了一个普通点,只能匹配.字符
# (163|126|qq) 表示一个分组,出现一个小括号就表示一个分组,分组是从1开始的
# 如果出现多个小括号,分组的顺序是从左到右一次排序
match_obj = re.match("[a-zA-Z0-9_]{4,20}@(163|126|qq)\.com", "[email protected]")
if match_obj:
    # 获取整个匹配的数据,如果使用分组数的化,默认是0
    result = match_obj.group(0)
    # 获取匹配分组数据
    type = match_obj.group(1)
    print(type)
    print(result)
else:
    print("匹配失败")


# "qq:3014587"
match_obj = re.match("(qq:)([1-9]\d{4,11})", "qq:3014587")  # 分组是为了方便提取数据
if match_obj:

    result = match_obj.group()
    print(result)

    result = match_obj.group(1)
    print(result)

    result = match_obj.group(2)
    print(result)
else:
    print("匹配失败")

# \num	引用分组num匹配到的字符串
match_obj = re.match("<([a-zA-Z1-6]+)>.*</\\1>", "<html>hh</div>")  # \\对反斜杠转义
if match_obj:
    result = match_obj.group()
    print(result)
else:
    print("匹配失败")


# <html><h1>www.baidu.cn</h1></html>
match_obj = re.match("<([a-zA-Z1-6]+)><([a-zA-Z1-6]+)>.*</\\2></\\1>", "<html><h1>www.baidu.cn</h1></html>")
if match_obj:

    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

# (?P<name>)	分组起别名
# (?P=name)	引用别名为name分组匹配到的字符串
match_obj = re.match("<(?P<name1>[a-zA-Z1-6]+)><(?P<name2>[a-zA-Z1-6]+)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.cn</h1></html>")
if match_obj:

    result = match_obj.group()
    print(result)
else:
    print("匹配失败")

我不想吃的水果: apple
我想吃的水果: banana
我不想吃的水果: orage
我想吃的水果: pear
我不想吃的水果: peach
163
hello@163.com
qq:3014587
qq:
3014587
匹配失败
<html><h1>www.baidu.cn</h1></html>
<html><h1>www.baidu.cn</h1></html>

加油!

感谢!

努力!

猜你喜欢

转载自blog.csdn.net/qq_46092061/article/details/128605960