一、正则表达式

正则表达式是一种用于匹配和处理文本的强大工具。它通过定义一种模式(pattern),可以快速搜索、替换或提取字符串中的特定内容。正则表达式在文本处理、数据验证、日志分析等领域有广泛的应用。常用的匹配规则如下:

元字符 描述
\w 匹配字母、数字、下划线
\W 匹配不是字母、数字、下划线的字符
\s 匹配任意空白字符、等价于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于[0–9]
\D 匹配任意非数字的字符
\A 匹配字符串开头
\Z 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配一个字符串的开头
$ 匹配一个字符串的结尾
. 匹配任意字符,除了换行符(添加re.S可匹配换行符)
* 匹配0个或多个前面的表达式
+ 匹配1个或多个前面的表达式
? 匹配0个或1个前面的表达式
.* 贪婪匹配(尽可能多的匹配)
.*? 非贪婪匹配(尽可能少的匹配)
[a-z0-9] 匹配a到z或0~9
[…] 用来表示一组字符,单独列出,比如[amk]匹配a, m或k
[^…] 不在[]内的字符,比如[^abc] 匹配除了a,b,c之外的字符
{n} 匹配n个前面的表达式
{n,m} 匹配n到m次前面的表达式(贪婪方式)
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组
r"f.g"       # f与g之间拥有任意一个字符
r"f.*g"      # f与g之间拥有任意个字符(贪婪尽可能多)
r"f.*?g"    # f与g之间拥有任意个字符(非贪婪尽可能少)
r"[\d]"      # 匹配单个数字
r"[0-5]"     # 匹配1个0-5之间的数字
r"[1357]"    # 匹配1个1/3/5/7中的某个数字
r"[a-z]"     # 匹配1个小写字母
r"[a-zA-Z]"  # 匹配1个大小写字母
r"[0-5]+"    # 匹配1个多个0-5之间的数字
r"[\d]{3}"   # 匹配3位数字
r"hello \S+ world"  # 匹配hello与world中间含有任意字符的字符串
修饰符 描述
re.I 忽略大小写(或re.IGNORECASE)
re.M 多行匹配,影响^和$(同re.MULTILINE)
re.S 使点号.匹配包括换行符在内的所有字符(同re.DOTALL)
re.L 做本地化识别匹配(同re.LOCALE)
re.U 根据Unicode字符集解析字符。这个影响\w,\W,\b,\B
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解(同re.VERBOSE)
修饰符中re.I、re.M、re.S比较常用

二、re.match()(开头位置匹配)

re.match(pattern, string, flags=0):一定从字符串起始位置开始匹配正则表达式,如果匹配到了则返回匹配结果,否则返回None

pattern:正则表达式
string:匹配的字符串
flags:可选,修饰符(如忽略大小写等)

函数 解说
result.groups() 获取所有括号内容(匹配规则需要有括号)
result.group() 完整匹配结果(含输入的内容)
result.group(0) 完整匹配结果(同上)
result.group(1) 第一组结果(匹配规则需要括号,有几组括号,里面只能写到几)
result.group(2) 第二组结果(匹配规则需要括号,有几组括号,里面只能写到几)
result.span() 匹配范围

举例:

import re

result = re.match('hello.*world', 'hello 123 world 456')
if result:  # 匹配成功,返回结果,否则返回None
	print(result.group()) # 匹配结果:hello 123 world
	print(result.span())  # 匹配范围: (0, 15)
用的最多
result = re.match('hello(.*)world(.*)', 'hello 123 world 456')
if result:  # 匹配成功,返回结果,否则返回None
	print(result.groups()) # 所有结果       (' 123 ', ' 456')
	print(result.group())  # 完整匹配结果    hello 123 world 456
	print(result.group(0)) # 完整匹配结果    hello 123 world 456
	print(result.group(1)) # 第一组结果       123
	print(result.group(2)) # 第二组结果       456

特殊处理:re.I | re.M | re.S

result = re.match('hello(.*)world(.*)', 'hello\n123\nworld\n456', re.I | re.M | re.S)
if result:  # 匹配成功,返回结果,否则返回None
	print(result.group(1)) # 匹配结果     \n123\n

三、re.search()(单一匹配)

re.search(pattern, string, flags=0):扫描整个字符串,找到第一个匹配的位置并返回匹配对象;如果没有找到匹配,则返回 None

pattern:正则表达式
string:匹配的字符串
flags:可选,修饰符(如忽略大小写等)

函数 解说
result.groups() 获取所以括号内容(匹配规则需要括号)
result.group() 完整匹配结果
result.group(0) 完整匹配结果(同上)
result.group(1) 第一组结果(匹配规则需要括号,有几组括号,里面只能写到几)
result.group(2) 第二组结果(匹配规则需要括号,有几组括号,里面只能写到几)
result.span() 匹配范围

举例:

import re

result = re.search(r'\d+', 'hello 123 world 456')
if result:  # 匹配成功,返回结果,否则返回None
	print(result.group()) # 匹配结果     123
	print(result.span())  # 匹配范围     (6, 9)
result = re.search(r'(\d+).*?(\d+)', 'hello 123 world 456')
if result:  # 匹配成功,返回结果,否则返回None
	print(result.groups()) # 所有结果       ('123', '456')
	print(result.group())  # 完整匹配结果    123 world 456
	print(result.group(0)) # 完整匹配结果    123 world 456
	print(result.group(1)) # 第一组结果      123
	print(result.group(2)) # 第二组结果      456
result = re.search(r'(\d+).*?(\d+)', 'hello\n123\nworld\n456', re.I | re.M | re.S)
if result:  # 匹配成功,返回结果,否则返回None
	print(result.groups(1)) # 所有结果     ('123', '456')

四、re.findall()(多匹配)返回列表

re.findall(pattern, string, flags=0):查找所有与正则表达式匹配的子串,以列表的形式返回。如果没有找到匹配,则返回一个空列表

pattern:正则表达式
string:匹配的字符串
flags:可选,修饰符(如忽略大小写等)

举例:

import re

result = re.findall(r'\d+', 'hello 123 world 456')
if result:  # 匹配成功,返回结果,否则返回空列表
	print(result) # 匹配结果     ['123', '456']
result = re.findall(r'(\d)(\d+)', 'hello 123 world 456')
if result:  # 匹配成功,返回结果,否则返回空列表
	print(result) # 匹配结果     [('1', '23'), ('4', '56')]
result = re.findall(r'\d+', 'hello\n123\nworld\n456', re.I | re.M | re.S)
if result:  # 匹配成功,返回结果,否则返回空列表
	print(result) # 匹配结果     ['123', '456']

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐