正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本匹配和处理工具,它使用一种特殊的语法模式来描述和定义字符串的搜索模式。主要用于在文本中搜索、匹配、替换符合某种模式的字符串,提供了非常灵活和高效的文本处理能力。
一、基本概念
1、元字符:
元字符是正则表达式语法的基础,它们具有特殊的含义,例如:. 、^ 、$、\d、\w、\s等,用于匹配特定类型的字符或位置。
菜鸟教程:正则表达式 – 元字符
2、字符类:
字符类用于匹配一个字符集合,例如 [a-z] 表示匹配任意小写字母,[0-9] 表示匹配任意数字等。
3、量词:
量词用于指定匹配的次数,例如 * (零次或多次)、+ (一次或多次)、?(零次或一次)、{n} (恰好n次)、{m, n} (至少m次,至多n次)等。
4、边界匹配:
边界匹配用于指定匹配的位置,例如 ^ 表示字符串的开头,$ 表示字符串的结尾,\b 表示单词边界。
5、分组和捕获:
使用圆括号 () 可以将正则表达式中的部分模式进行分组,并且可以捕获匹配的内容供后续使用。
6、反向引用:
在正则表达式中,可以使用反向引用来引用前面捕获的分组内容。
7、特殊序列:
特殊序列提供了一些便捷的方式来匹配常见的模式,例如 \d (匹配数字)、\s (匹配空白字符)、\w (匹配字母、数字或下划线)等。
二、常用函数、方法
1、re.compile(pattern, flags=0)
编译正则表达式模式 pattern 成一个可重复使用的正则表达式对象。
flags是可选的,用于指定匹配模式,如 re.IGNORECASE(忽略大小写)等。
import re
pattern = re.compile(r'\d+') # 匹配数字的正则表达式
2、re.search(pattern, string, flags=0)
在字符串 string 中搜索匹配正则表达式 pattern 的第一个位置,并返回一个匹配对象 match。
如果找到匹配,则返回第一个匹配对象;如果没有找到匹配,则返回None。
import re
match = re.search(r'\d+', 'abc123def')
if match:
print(match.group()) # '123'
3、re.match(pattern, string, flags=0)
尝试从字符串 string 的开头匹配正则表达式 pattern。
如果匹配成功,则返回一个匹配对象 match;如果不成功,则返回None。
import re
match = re.match(r'\d+', 'abc123def')
if match:
print(match.group()) # '123'
4、re.findall(pattern, string, flags=0)
在字符串 string 中查找所有匹配正则表达式 pattern 的非重叠子字符串,并返回一个列表。
import re
results = re.findall(r'\d+', 'abc123def456')
print(results) # ['123', '456']
5、re.finditer(pattern, string, flags=0)
返回一个迭代器,迭代器生成在字符串 string 中所有与正则表达式 pattern匹配的匹配对象。
import re
iterator = re.finditer(r'\d+', 'abc123def456')
for match in iterator:
print(match.group()) # '123' 和 '456'
6、re.sub(pattern, repl, string, count=0, flags=0)
在字符串 string 中查找所有匹配正则表达式 pattern 的子字符串,并用repl替换它们。
count 是可选参数,指定替换的最大次数。
import re
new_string = re.sub(r'\d+', 'NUM', 'abc123def456')
print(new_string) # 'abcNUMdefNUM'
7、re.split(pattern, string, maxsplit=0, flags=0)
根据正则表达式 pattern 分割字符串 string。
maxsplit 是可选参数,指定最大分割次数。
import re
parts = re.split(r'\d+', 'abc123def456')
print(parts) # ['abc', 'def', '']
8、match.group()
返回匹配的字符串。
可以传入整数参数 group(i),返回第 i 个括号子组匹配的内容。
import re
match = re.search(r'(\d+)-(\d+)', '2024-07')
print(match.group()) # '2024-07'
print(match.group(1)) # '2024'
print(match.group(2)) # '07'
9、match.start()和match.end()
分别返回匹配的子字符串的起始和结束位置的索引。
import re
match = re.search(r'\d+', 'abc123def')
print(match.start()) # 3
print(match.end()) # 6
10、match.span()
返回一个元组,包含匹配的子字符串的起始和结束位置的索引。
import re
match = re.search(r'\d+', 'abc123def')
print(match.span()) # (3, 6)
注意事项:
1、在使用正则表达式时,特殊字符需要进行转义或使用原始字符串(以 r 开头)。
2、正则表达式的性能受到模式复杂度和数据量的影响,大数据量和复杂模式可能会导致性能下降。
3、使用re.compile(),可以预编译正则表达式,提高重复使用时的效率。