目录
前言
正则表达式(Regex)是一种用于匹配字符串模式的工具,在文本处理、搜索、替换中具有广泛应用,基于特殊字符和语法来描述模式。
一、认识正则表达式
1.1 正则表达式是什么
正则表达式是一种用于描述字符串模式的工具,它可以用来在文本中进行搜索、匹配和替换操作。正则表达式由字符和特殊符号组成,用于定义字符串的规则,从而可以高度灵活地匹配符合某种模式的文本内容。在编程中,正则表达式被广泛用于文本处理、字符串匹配、数据提取等任务,它们可以用来检查字符串是否符合某种格式、从文本中提取特定信息,或者对文本进行复杂的变换操作。
1.2 为什么要使用正则表达式
一种可以让复杂的字符串问题变得简单的工具
代码如下(示例):
tel = '15468546624'
# 方法1:字符串操作
if len(tel) == 11:
if tel[0] == '1' and '3' <= tel[1] <= '9':
if tel[2:].isdigit():
print(True)
else:
print(False)
else:
print(False)
else:
print(False)
# 方法2:正则表达式
from re import fullmatch
print(fullmatch(r'1[3-9]\d{9}', tel) is not None)
通过上述代码中的方法一和方法二对比可以看出,使用正则表达式可以让代码更加简洁。
二、学习正则表达式
2.1 匹配类符号
from re import fullmatch
1)普通字符(普通符号)
*普通符号在正则表达式中表示符号本身
代码如下(示例):
result = fullmatch(r'abc', 'abc') is not None
print(result)
2) .
匹配任意字符
result = fullmatch(r'.bc', 'obc') is not None
print(result)
3) \d
匹配任意一个数字
result = fullmatch(r'a\dc', 'a5c') is not None
print(result)
4) \s
匹配任意一个空白字符
result = fullmatch(r'a\sc', 'a c') is not None
print(result)
5) \w
匹配任意一个数字、字母、下划线或者中文
result = fullmatch(r'a\wc', 'a1c') is not None
print(result)
6) \D \S \W
\D - 匹配任意一个非数字字符
\S - 匹配任意一个空白字符
\W - 匹配任意一个非(数字,字母,下划线,中文)字符
result = fullmatch(r'\D\d\s\S\w\W', '111111') is not None
print(result)
7) [字符集]
匹配字符集中任意一个字符
[多个字符] - 匹配多个字符中的任意一个
[\dxy] - 匹配任意一个数字或者一个x或者一个y
[\d\s] - 匹配任意一个数字或者空白字符
result = fullmatch(r'a[123]c', 'a2c') is not None
print(result)
result = fullmatch(r'a[1-5]c', 'a2c') is not None
print(result)
result = fullmatch(r'a[\dxy]c', 'a2c') is not None
print(result)
result = fullmatch(r'a[\da-zA-Z]c', 'a2c') is not None
print(result)
result = fullmatch(r'a[\u4e00-\u9fa5]c', 'a2c') is not None
print(result)
8) [^字符集]
匹配不存在字符集中的任意一个字符
result = fullmatch(r'a[^123]c', 'a2c') is not None
print(result)
# 注意:[]中,^只有放在最前面的时候才有特殊功能,-只能放在两个字符之间的时候采用特殊功能
2.2 匹配次数
from re import *
1) *
匹配任意次数
"""
a* - 任意多个字符a
\d* - 任意多个数字字符
"""
result = fullmatch(r'xa*y', 'xaaaaaaaay') is not None
print(result)
result = fullmatch(r'x\d*y', 'x15453453y') is not None
print(result)
2)+
匹配一次或者多次
result = fullmatch(r'xa+y', 'xay') is not None
print(result)
3)?
匹配做多一次
result = fullmatch(r'xa?y', 'xay') is not None
print(result)
4){}
"""
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
"""
result = fullmatch(r'xa{9}y', 'xaaaaaaaaay') is not None
print(result)
5) 贪婪和非贪婪
当匹配次数不确定的时候,匹配的时候分为贪婪模式和非贪婪模式两种,默认是贪婪的
如果多种次数都可以匹配成功,贪婪最后取最多的次数进行匹配,非贪婪取最少的次数进行匹配
# match(正则表达式, 字符串) - 匹配字符串开头
result = fullmatch(r'\d{3}', '456') is not None
print(result)
result = match(r'\d{3}', '456萨达的说法萨芬5aa') is not None
print(result)
# 3 7
result = match(r'a.+b', 'adsdb的撒b') #贪婪模式
print(result)
result = match(r'a.+?b', 'adsdb的撒b') #非贪婪
print(result)
2.3 分组
写正则表达式的时候可以使用()将正则表达式的部分内容括起来,被括起来的内容就是一个分组
1)整体操作
# '23sda23vdf45vdv'
# 方法1:
result = fullmatch(r"\d\d[a-z]{3}\d\d[a-z]{3}\d\d[a-z]{3}", '23sda23vdf45vdv')
print(result)
# 方法2:
result = fullmatch(r"(\d\d[a-z]{3}){3}", '23sda23vdf45vdv')
print(result)
# 方法3:
result = fullmatch(r'([A-Z]\d)*', 'A7D8S9F9F0S7S8F9S8')
print(result)
2)重复
在正则表达式中可以通过'\m'来重复前面第m个分组中匹配到的内容
# 45HJK45、78FGH78
result = fullmatch(r"(\d\d)[A-Z]{3}\1", '45HJK45')
print(result)
# 54asSA--daSAas454
result = fullmatch(r"(\d{2})([a-z]{2})([A-Z]{2})--[a-z]{2}\3\2\d\1", '54asSA--daSAas454')
print(result)
3)捕获
a.自动捕获
re 模块中findall可以对正则表达式的匹配结果进行自动捕获(自动捕获正则中分组匹配到的内容)
result = findall(r"(\d{2})[\u4e00-\u9fa5]", '45的89的45sds')
print(result)
b.手动捕获
匹配对象.group() - 获取正则匹配到的结果 匹配对象.
group(N) - 获取第N个分组匹配到的结果
result = fullmatch(r"(\d\d)[A-Z]{3}\1", '45HJK45')
print(result.group(1))
2.4 分支和转义字符
1)分支
正则1|正则2 - 先用正则1进行匹配,如果匹配失败再用正则2进行匹配
# ab123,abMK,ab456,abSD
print(fullmatch(r'ab\d{3}|ab[A-Z]{2}', 'ab123'))
print(fullmatch(r'ab(\d{3}|[A-Z]{2})', 'abAD'))
2)转义符号
在有特殊功能的符号面前加\,让有特殊功能的符号变成一个普通字符
# '23.45','45.23'
print(fullmatch(r'\d\d\.\d\d', '12.45'))
# (456)-45678
print(fullmatch(r'\(\d{3}\)-\d{5}', '(456)-45678'))
print(fullmatch(r'\(\d+\)-\d+', '(456)-45678'))
注意:单独存在有特殊功能的符号在[]中会自动生成一个普通字符.
2.5检测类符号
检测类符号:在匹配成功的前提下,检测对应的位置是否符合相关要求.
from re import *
1)\b
检测是否是单词边界
单词边界:凡是可以把两个单词区分出来的符号 :空白符号,英文标点符号,符号开头和符号结尾
print(fullmatch(r'\d{2}\s\b\d{3}', '45 456'))
result = findall(r'\d{3}', '478 大四7456, sd456你d as123')
print(result)
result = findall(r'\d{3}\b', '478 大四7456, sd456你d as123')
print(result)
result = findall(r'\b\d{3}\b', '478 大四7456, sd456你d as123')
print(result)
2)\B
检测是否不是单词边界
result = findall(r'\d{3}\B', '478 大四7456, sd456你d as123')
print(result)
3)^
检测字符是字符串开头
result = findall(r'^\d{3}', '478 大四7456, sd456你d as123')
print(result)
4)$
检测字符是字符串结尾
result = findall(r'\d{3}$', '478 大四7456, sd456你d as123')
print(result)
result = search(r'^1[3-9]\d{9}$', '15475482235')
print(result)
三.Python-re模块
re模块是python用来专门提供正则表达式相关函数的模块
from re import fullmatch, match, search, findall, finditer, split, sub
3.1 fullmatch函数
fullmatch(正则表达式, 字符串)
完全匹配(让正则表达式和整个字符串进行匹配),如果匹配成功返回匹配对象,匹配失败返回None
print(fullmatch(r'\d{3}', '123'))
3.2 match函数
match(正则表达式, 字符串)
匹配字符串开头(让正则表达式和字符串的开头进行匹配),如果匹配成功返回匹配对象,匹配失败返回None
print(match(r'\d{3}', '123打算大苏打大苏打是'))
3.3 search函数
search(正则表达式,字符串)
匹配第一个子串(匹配字符串中第一个符号正则表达式规则的子串),如果匹配成功返回匹配对象,匹配失败返回None
print(search(r'\d{3}', '打算大123苏打大苏456打是'))
3.4 findall函数
findall(正则表达式,字符串)
提取字符串中所有满足正则表达式的子串,返回值是一个列表,列表的元素是所有匹配到的内容(会自动捕获)
print(findall(r'\d{3}', '打算大123苏打大苏456打是'))
3.5 finditer函数
finditer(正则表达式,字符串)
提取字符串中所有满足正则表达式的子串,返回值是一个迭代器,迭代器中的元素为每一个匹配到的子串
print(list(finditer(r'\d{3}', '打算大123苏打大苏456打是')))
3.6 split函数
split(正则表达式,字符串)
将字符串中所有满足正则表达式的子串作为切割点对字符串进行切割
print(split(r'\d{3}', '打算大123苏打大苏456打是'))
3.7 sub函数
sub(正则表达式,字符串1,字符串2)
将字符串2中所有满足正则表达式的子串都替换成字符串1
print(sub(r'\d{3}', 'XY', '打算大123苏打大苏456打是'))
总结
在编程中,正则表达式广泛应用于字符串处理、数据提取、格式验证等任务。无论是搜索关键词、验证邮箱格式,还是从大量文本中提取信息,正则表达式都能快速准确地完成工作。然而,正则表达式的学习曲线较陡,模式的构建需要一定的经验和练习。
要注意的是,过于复杂的正则表达式可能导致性能问题,因此在构建模式时需要权衡精确性和效率。同时,正则表达式的语法因编程语言而异,需要根据具体语言进行调整。
总之,正则表达式是文本处理领域中不可或缺的工具,掌握它能够提升文本处理效率,拓展编程技能。通过不断练习和实践,我们可以更好地利用正则表达式来解决各种文本处理难题。