Python-正则表达式详解

本文介绍了正则表达式的概念,如何在Python中使用re模块进行字符串匹配,包括全匹配、特殊符号匹配、次数限制、分支结构、分组以及贪婪和非贪婪模式的应用。通过实例展示了如何检查手机号合法性、分割字符串和验证标签格式。
摘要由CSDN通过智能技术生成

一、认识正则表达式

1. 什么是正则表达式

正则表达式是一种可以让复杂的字符串变得简单的工具。

# 案例1:写程序判断一个字符串是否是一个合法的手机号  
str1 = '13678192323'  
  
# 方法1:不使用正则  
if len(str1) != 11:  
print('不合法')  
else:  
if str1[0] != '1':  
print('不合法')  
else:  
if str1[1] in '012':  
print('不合法')  
else:  
for x in str1[2:]:  
if not x.isdigit():  
print('不合法')  
break  
else:  
print('合法')  
  
# 方法2:使用正则  
from re import fullmatch, split  
if fullmatch(r'1[3-9]\d{9}', str1):  
print('合法')  
else:  
print('不合法')  
  
  
# 案例2:将字符串中所有的数字子串作为切割点进行切割  
str1 = 'amn23kjs892换手技术34江苏师范'  
result = split(r'\d+', str1)  
print(result)
不管使用正则解决的是什么样的字符串问题,写正则表达式的目的只有一个:用正则表达式描述字符串规则

二、正则表达式匹配类符号

1. 正则表达式

写正则表达式就是用各种各样的正则符号来描述字符串规则

2. re模块

re模块是python的系统模块,这个模块中提供了各种各样和正则表达式相关的函数。
在python中使用正则表达式是通过re模块中的函数来用的。
fullmatch(正则表达式, 字符串) - 完全匹配,让整个字符串和正则进行匹配(判断整个字符串是否符合正则表达式所描述的规则),如果匹配成功返回值是匹配对象,匹配失败返回None
注:正则表达式的格式 - r’正则表达式’
from re import fullmatch

3.匹配类符号

1)普通符号 - 表达式符号本身

result = fullmatch(r'abc', 'abc')  
print(result)

2) . - 匹配任意一个字符

result = fullmatch(r'.bc', '块bc')  
print(result)

3) \d - 匹配任意一个数字字符

result = fullmatch(r'a\db', 'a3b')  
print(result)

4) \s - 匹配任意一个空白字符(空格、\t、\n)

result = fullmatch(r'a\sb', 'a b')  
print(result)

5) \w - 匹配任意一个字母、数字、下划线和中文

result = fullmatch(r'a\wb', 'a块b')  
print(result)

6)\D、\S、\W

\D - 匹配任意一个非数字字符
\S - 匹配任意一个非空白字符
\W - 匹配任意一个非(数字、字母、下划线或者中文)
result = fullmatch(r'1\D2\S3\W', '1,2集3#')  
print(result)

7)[字符集] - 匹配在字符集中的任意一个字符

1)[MNA] - 匹配M或者N或者A
2)[\dMN] - 匹配任意一个数字或者M或者N
3)[1-9] - 匹配数字字符1到9中的任意一个
4)[a-z] - 匹配任意一个小写字母
5)[\u4e00-\u9fa5] - 匹配任意一个中文
6)[a-zA-Z] - 匹配任意一个字母
9)[a-zA-Z\d] - 匹配任意一个字母或者数字
10)[a-zA-Z\d+] - 匹配任意一个字母或者数字或者+
# 'aAb'  
result = fullmatch(r'a[MNA]b', 'aMb')  
print(result)  
  
# '+34'、'-45'、'-98'  
result = fullmatch(r'[+-]\d\d', '+90')  
print(result)  
  
result = fullmatch(r'a[MN\d]b', 'aMb')  
print(result)  
  
result = fullmatch(r'a[1-8]b', 'a2b')  
print(result)  
  
result = fullmatch(r'a[\u4e00-\u9fa5]b', 'a是b')  
print(result)

8)[^字符集] - 匹配不在字符集中的任意一个字符

result = fullmatch(r'a[^MN]b', 'a@b')  
print(result)  
  
result = fullmatch(r'a[^A-Z]b', 'amb')  
print(result)

三、匹配次数

from re import fullmatch,match,findall

1. * - 任意次数(包括0次)

result = fullmatch(r'a\d*b', 'a890b')  
print(result)  
  
result = fullmatch(r'a*\db', 'aaaa3b')  
print(result)  
  
result = fullmatch(r'a[A-Z]*b', 'aMMKb')  
print(result)

2. + - 至少1次

result = fullmatch(r'a\d+b', 'a23b')  
print(result)

3. ? - 最多1次(0次或者1次)

‘-7283’

result = fullmatch(r'-?\d+', '-2344')  
print(result)

4. {}

{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
result = fullmatch(r'\d{3,5}abc', '2492abc')  
print(result)

5.贪婪和非贪婪

在匹配次数不确定的时候,匹配模式可以分为贪婪和非贪婪两种。
在能匹配成功的情况下,如果有多种次数都可以匹配成功,贪婪取最多的那个次数进行匹配,非贪婪取最少的那个次数进行匹配。
贪婪模式:*、+、?、{M,N}、{M,}、{,N}
非贪婪模式:*?、+?、??、{M,N}?、{M,}?、{,N}?
补:match(正则, 字符串) - 匹配字符串开头
# 2 5 8  
result = match(r'a.+b', 'amnb你好b12b开始三大')  
print(result) # <re.Match object; span=(0, 10), match='amnb你好b12b'>  
  
result = match(r'a.+?b', 'amnb你好b12b开始三大')  
print(result) # <re.Match object; span=(0, 4), match='amnb'>

四、分支和分组

from re import *

1. 分支 - |

正则表达式1|正则表达式2 - 先让字符串和正则表达式1进行匹配,如果失败再和正则表达式2进行匹配
# 'abcMKJ'、'abc23'、'abcMHA'、 'abc34'result = fullmatch(r'abc[A-Z]{3}|abc\d{2}', 'abc23')  
print(result)  
  
result = fullmatch(r'abc([A-Z]{3}|\d{2})', 'abc23')  
print(result)

2. 分组 - ()

1) 整体操作
# 'M12K34L45...'  
result = fullmatch(r'([A-Z]\d{2})+', 'K34P23H34B23')  
print(result)  
  
result = fullmatch(r'abc([A-Z]{3}|\d{2})', 'abc23')  
print(result)

2) 重复

在正则表达式中可以通过 ‘\N’ 来重复它前面第N个分组匹配到的结果 (N指的是任意一个正整数)
# 'mn123mn'、'kh234kh'、'ak109ak'  
result = fullmatch(r'([a-z]{2})\d{3}\1', 'mn123mn')  
print(result)  
  
result = fullmatch(r'([A-Z]{3})abc(\d{2})\1\2{3}', 'MKJabc12MKJ121212')  
print(result)  
  
# 案例: 写一个正则表达式判断指定字符串是否是一个合法的标准标签  
# '<标签名>标签内容</标签名>'  
result = fullmatch(r'<([a-zA-Z\d]+)>[^<>]*</\1>', '<p>你好</p>')  
print(result)

3)捕获

a.自动捕获 - findall这个函数中的正则表达式中如果有分组,获取匹配结果是时候自动捕获分组匹配到的结果
findall(正则表达式, 字符串) - 提取字符串中所有满足正则表达式的子串
result = findall(r'(\d{3})[\u4e00-\u9fa5]', 'm234mn数据290mk283-js2839吗=239科技师范=2800=')  
print(result)
b.手动捕获 - 如果正则函数的结果是匹配对象,在正则表达式中有分组的时候,就可以对匹配对象进行手动捕获(手动获取分组匹配到的结果)
result = match(r'(\d{3})([\u4e00-\u9fa5])', '234吗lkshkf 沙发沙发')  
print(result) # <re.Match object; span=(0, 4), match='234吗'>
匹配对象.group() - 获取整个正则表达式匹配到的结果
匹配对象.group(N) - 获取匹配结果中第N个分组匹配到的内容
print(result.group()) # 234吗  
print(result.group(1)) # 234  
print(result.group(2)) # 吗
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值