本篇文章主要是针对初学者,对正则表达式的理解、作用和应用
正则表达式🌟
- 一、🍉正则表达式的概述
- 二、🍉正则表达式的语法和使用
- 三、 🍉正则表达式的常用操作符
- 四、🍉re库主要功能函数
一、🍉正则表达式的概述
- 通用的字符串表达框架
- 简洁表达一组字符串的表达式
- 针对字符串表达“简洁”和“特征”思想的工具
- 判断某字符串的特征归属
正则表达式在文本处理中十分常用
- 表达式文本类型的特征(病毒、入侵等)
- 同时查找或替换一组字符串
- 匹配字符串的全部或部分
二、🍉正则表达式的语法和使用
-
语法:
正则表达式语法由字符和操作符构成
P(Y|YT|YTH|YTHO)?N
-
使用
编译:将符合正则表达式语法的字符串转换成正则表达式特征。
三、 🍉正则表达式的常用操作符
操作符 | 说明 | 实例 |
---|---|---|
. | 表示任何单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc]表示a、b、c,[a-z]表示a到z单个字符 |
[ ^ ] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
* | 前一个字符0次或无限次扩展 | abc*表示ab、abc、abcc、abcc等 |
+ | 前一个字符1次或无限次扩展 | abc+表示abc、abcc、abccc等 |
? | 前一个字符0次或1次扩展 | abc?表示av、abc |
| | 左右表达式任意一个 | abc|def表示abc、def |
{m} | 扩展前一个字符m次 | ab{2}c表示abbc |
{m,n} | 扩展前一个字符m至n次(含n) | ab{1,2}c表示abc、abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串的结尾 |
() | 分组标记,内部只能使用|操作符 | (abc)表示abc,(abc|def)表示abc、def |
\d | 数字,等价于[0-9] | |
\w | 单词字符,等价于[A-Za-z0-9] |
四、🍉re库主要功能函数
函数 | 说明 |
---|---|
re.search(pattern, string) | 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.match(pattern, string) | 从一个字符串的开始位置起匹配正则表达式,返回match对象 |
re.findall(pattern, string) | 搜索字符串,以列表类型返回全部能匹配的子串 |
re.split(pattern, string) | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer(pattern, string) | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 |
re.sub(pattern, string) | 在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串 |
re.compile(pattern[, flags]) | |
re.escape(string) |
re
模块中常用函数的简单介绍:
语法:
re.函数(pattern, string,flags=0)
- pattern:正则表达式的字符串或原生字符串表示
- string:待匹配字符串
- flags:正则表达式使用时的控制标记
-
re.search(pattern, string,flags=0):
在字符串中搜索匹配正则表达式pattern
的第一个位置,返回一个匹配对象,如果没有找到匹配的,则返回None。import re match = re.search(r'\d+', 'hello 123 world') if match:print('找到匹配:', match.group()) else:print('未找到匹配')
-
re.match(pattern, string,flags=0):
从字符串的起始位置匹配正则表达式pattern
,如果起始位置没有匹配到,则返回None。注意这与search()
不同,search()
会扫描整个字符串以查找匹配项。match = re.match(r'\d+', '123 hello world') if match:print('找到匹配:', match.group()) else:print('未找到匹配')
-
re.findall(pattern, string):
返回字符串中所有与正则表达式pattern
相匹配的所有非重叠匹配项的列表。如果未找到匹配项,则返回空列表。matches = re.findall(r'\b\w+\b', 'Hello World! This is a test.') print(matches) # 输出:['Hello', 'World', 'This', 'is', 'a', 'test']
-
re.sub(pattern, repl, string, count=0, flags):
将字符串中所有与正则表达式pattern
匹配的部分替换为repl
,并返回修改后的字符串。count
参数可以指定替换的最大次数,默认为0,表示替换所有匹配项。result = re.sub(r'\d+', 'NUMBER', 'hello 123 world 456') print(result) # 输出:'hello NUMBER world NUMBER'
-
re.compile(pattern[, flags]):
编译正则表达式字符串为一个正则表达式对象,这样可以提高使用相同模式进行多次匹配的效率。pattern = re.compile(r'\d+') match = pattern.match('123 hello') if match:print('找到匹配:', match.group())
-
re.escape(string):
转义字符串中的特殊字符,使得它们在正则表达式中作为字面值字符对待。pattern = re.compile(re.escape('[') + r'\d+' + re.escape(']')) match = pattern.search('[123]') if match:print('找到匹配:', match.group())
-
re.split(pattern,string,maxsplit=0,flags=0):
将一个字符串按照正则表达式匹配进行分割返回列表类型
- maxsplit:最大分割数,剩余部分作为最后一个元素输出
import re result1=re.split(r'[1-9]\d{5}','BIT100081 TSU100084') print(result1) result2=re.split(r'[1-9]\d{5}','BIT100081 TSU100084',maxsplit=1) print(result2)
-
re.finditer(pattern, string):
搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是,match对象
import re for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):if m:print(m.group(0))
拓展
:
- re库的另一种等价用法:
# 第一种 函数式用法:一次性操作
rst=re.search(r'[1-9]\d{5}','BIT 100081')
# 第二种 面对对象用法:编译后的多次操作
pat=ree.compile(r'[1-9]\d{5}')
rst=pat.search('BIT 100081')
-
match对象介绍
Match对象一次匹配的结果,包含匹配的很多信息
import re match=re.search(r'[1-9]\d{5}','BIT 100081') if match:print(match.group(0))print(type(match))
match对象的属性:
属性 说明 .string 待匹配的文本 .re 匹配时使用的patter对象(正则表达式) .pos 正则表达式搜索文本的开始位置 .endpos 正则表达式搜索文本的结束位置 match对象的方法:
方法 说明 .group(0) 获得匹配的字符串 .start() 匹配字符串在原始字符串的开始位置 .end() 匹配字符串在原始字符串的结束位置 .span() 返回(.start(),.end()) import re match=re.search(r'[1-9]\d{5}','BIT100081 TSU100084') print(match.string) print(match.re) print(match.pos) print(match.endpos) print(match.group(0)) print(match.start()) print(match.end()) print(match.span())
-
贪婪匹配
Re默认采用贪婪匹配,即输出匹配最长的字串
import re match=re.search(r'PY.*N','PYANBNCNDN') print(match.group(0))
最小匹配:如何输出最短的子串呢?
import re match=re.search(r'PY.*?N','PYANBNCNDN') print(match.group(0))
最小匹配操作符
操作符 说明 *? 前一个字符0次或无限次扩展,最小匹配 +? 前一个字符1次或无限次扩展,最小匹配 ?? 前一个字符0次或1次扩展,最小匹配 {m,n}? 扩展前一个字符m至n次(含n),最小匹配 -
典型例子:
在Python中,可以使用
re
模块(正则表达式模块)来匹配IP地址。一个基本的IPv4地址由四个0到255之间的数字组成,每部分之间用点(“.”)分隔。下面是一个简单的例子,展示了如何编写一个正则表达式来匹配这样的IP地址:
import redef is_valid_ip(ip):# 定义IP地址的正则表达式ip_pattern = re.compile(r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$')# 使用正则表达式匹配IP地址if ip_pattern.match(ip):return Trueelse:return Falseif __name__ == '__main__':# 测试函数ips = ["192.168.1.1", "255.255.255.255", "123.456.789.0", "1.2.3"]for ip in ips:print(f"{ip}: {is_valid_ip(ip)}")
这段代码首先导入了re
模块,并定义了一个函数is_valid_ip
,该函数使用一个正则表达式来检查输入的字符串是否符合IPv4地址的格式。正则表达式的详细解释如下:
^
:表示字符串的开始。((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
:这部分匹配前三部分的数字,每部分数字范围是0到255,后面跟着一个点(“.”)。其中,25[0-5]
匹配从250到255的数字,2[0-4][0-9]
匹配从200到249的数字,[01]?[0-9][0-9]?
匹配0到199的数字,包括前导零的情况。\.
表示匹配点字符本身(因为点在正则表达式中有特殊含义,所以需要用反斜杠转义)。
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
:这部分匹配第四部分的数字,后面跟上字符串的结束标志$
。
经典正则表达式实例:
表达式 | 解释 |
---|---|
^ [A - Za-z]+$ | 由26个字母组成的字符串 |
^ [A-Za-Z0-9]+$ | 由26个字母和数字组成的字符串 |
^- ? \d+$ | 整数形式的字符串 |
^ [0-9] * [1-9] [0-9] * $ | 正整数形式的字符串 |
[1-9] \d{5} | 中国境内邮政编码,6位 |
[\u4e00-\u9fa5] | 匹配中文字符 |
\d{3}-d{8}|\d{4}-\d{7} | 国内电话号码,010-68913536 |