正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式应用场景主要有爬虫、替换、文本搜索、提取和格式校验等。
一、正则表达式组成
正则表达式的组成包括普通字符、元字符、预定义字符类、数量词、位置符、分组和反向引用等元素。这些元素结合在一起,能够形成复杂且灵活的匹配模式。通过python中内置模块re实现对正则表达式的使用,并将匹配结果以字符串的形式存入列表中。基本适用代码为:
import re
# 被匹配字符串
context = '怒发冲冠,凭栏处、潇潇雨歇。'
# 匹配规则为匹配任意字符
rule = '^怒发冲冠'
# 根据定义规则进行匹配
result = re.findall(rule, context)
1、普通字符:
普通字符表示保持其字面含义的字符,例如’a’。
2、元字符:
元字符用于构建复杂的匹配规则,常见的元字符有‘.’、‘^’、‘$’等。
元字符名称 | 说明 |
‘.’ | 用于匹配换行符以外的任意单个字符 |
‘^’ | 用于匹配字符串的开头。例如:'^421' |
‘$’ | 用于匹配字符串的末尾。例如:'421$' |
‘*’ | 用于匹配前面表达式0次或多次。如果匹配不上则返回空字符串('’),而不是不返回任何值。例如:'1*',会将被匹配字符串中的单一字逐一与规则匹配。 |
‘+’ | 用于匹配前面表达式1次或多次。如果匹配不上则不返回任何值(包括空字符串)。 |
‘?’ | 用于匹配前面表达式0次或1次。如果匹配不上则返回空字符串('’),而不是不返回任何值。 |
‘[]’ | 此为字符集,用于匹配字符集中任意字符。例如:'[怒舅舅]',只要这三个字任意一个匹配上即可。 |
‘|’ | ‘或’逻辑运算符,也称为管道符。如果使用管道符,则表达式会从左至右依次匹配,原理类似“匹配字符串将从原有字符串中剪切掉,供下一个规则进行匹配”。因此,需要将最复杂的规则放在最前面。 |
‘()’ | 分组符号,与‘[]’相对应 |
‘(?:)’ | 表示分组不捕获,与“()”最大的区别在于不存储匹配的子字符串 |
‘\b’ | 是一种位置符,表示“单词边界”(所谓单词边界指前面是中文或数字或字符或下划线(等价于\w),而后面是其他字符。反过来亦然。以及字符串的开头和结尾)。此方式能够精准获取想要的内容。例如:一段英文中精准获取word单词,而不是wording。 |
3、预定义字符类
预定义字符类指简单的特殊字符等价于复杂的表达式,但是在使用时需要注意将‘\’转义。具体如下:
预定义字符类 | 说明 |
‘\d’ | 等价于‘[0-9]’,表示匹配由数字组成的1个或多个字符长度的字符串。 |
‘\D’ | 表示匹配由非数字组成的1个或多个字符长度的字符串。 |
‘\w’ | 等价于'[\u4e00-\u9fa5a-zA-Z0-9_]',表示匹配任意字母、数字、中文和_ |
‘\W’ | 表示匹配非任意字母、数字、中文和_ |
‘\s’ | 表示匹配任意空白字符,包括空格、制表符、换行符等。 |
‘\S’ | 表示匹配非任意空白字符 |
4、数量词
数量词 | 说明 |
‘{n}’ | 匹配恰好n次。如果匹配不上则不返回任何值 |
‘{n,}’ | 匹配至少n次。 |
‘{n,m}’ | 匹配至少n次,至多m次。 |
二、实例
验证邮箱
import re
with open('./context.txt', mode = 'r', encoding='utf-8') as file:
# 被匹配字符串
context = file.read()
# 匹配规则为匹配任意字符
# rule = '[\u4e00-\u9fa5a-zA-Z0-9_]+'
rule0 = '\\w@(163|qq)\\.com'
rule = '\\w+@(?:163|qq)\\.com' # 仅验证规则,不捕获
result0 = re.findall(rule0, context)
result = re.findall(rule, context)
print(result0)
print(result)
# 使用捕获输出结果:['163', 'qq']
# 使用不捕获输出结果:['L15151953421@163.com', '12345678@qq.com']