目录
引言
一、正则表达式
二、正则表达式语法详解
2.1 基本元字符
2.2 匹配结果方法
2.3 编译标志(flags 参数)
2.4 re模块核心函数
三、注意事项
参考
引言
正则表达式是文本处理的瑞士军刀,而Python的re模块则是操作这把利器的重要工具包。无论你是需要验证用户输入、从文本中提取数据,还是进行复杂的文本替换操作,re模块都能提供强大而灵活的支持。
一、正则表达式
正则表达式(Regular Expression,简称regex)是一种用于描述字符串模式的特殊语法。它使用一系列特殊字符和普通字符来定义一种模式,然后用这种模式去匹配、查找、替换或分割文本。
python的re模块导入方法:
import re
二、正则表达式语法详解
2.1 基本元字符
| 元字符 | 功能描述 | 示例 | 匹配结果 |
|---|---|---|---|
. |
匹配任意单个字符(除了换行符) | a.b |
匹配"aab", "a5b", "a b"等 |
^ |
匹配字符串的开头 | ^Hello |
匹配以"Hello"开头的字符串 |
$ |
匹配字符串的结尾 | world$ |
匹配以"world"结尾的字符串 |
* |
匹配前面的子表达式零次或多次 | ab*c |
匹配"ac", "abc", "abbc"等 |
+ |
匹配前面的子表达式一次或多次 | ab+c |
匹配"abc", "abbc"等,但不匹配"ac" |
? |
匹配前面的子表达式零次或一次 | colou?r |
匹配"color"和"colour" |
{m} |
匹配前面的子表达式恰好m次 | a{3} |
匹配"aaa" |
{m,n} |
匹配前面的子表达式至少m次,最多n次 | a{2,4} |
匹配"aa", "aaa"或"aaaa" |
[ ] |
字符集合,匹配所包含的任意一个字符 | [abc] |
匹配a、b或c中的任意一个字符 |
[^ ] |
负值字符集合,匹配未包含的任意字符 | [^abc] |
匹配除了a、b、c之外的任何字符 |
[a-z] |
匹配a到z之间的所有小写字母 | [a-z] |
匹配任何小写字母 |
| | | 或运算符,匹配左边或右边的表达式 | cat|dog |
匹配"cat"或"dog" |
( ) |
分组标记,将表达式分组并捕获匹配的文本 | (ab)+ |
匹配"ab", "abab"等 |
(?: ) |
定义非捕获分组 | ||
\ |
转义字符,将特殊字符转义为普通字符 | \. |
匹配句点"."本身 |
\d |
匹配数字 |
\d+ |
匹配"123" |
\D |
匹配非数字 |
\D+ |
匹配"abc" |
\w |
匹配单词字符(字母、数字、下划线) |
\w+ |
匹配"A_a" |
\W |
匹配非单词字符 |
\W+ |
匹配"#!" |
\s |
匹配空白字符(空格、制表符等) |
\s+ |
匹配"\t" |
\S |
匹配非空白字符 |
\S+ |
匹配"abc" |
2.2 匹配结果方法
| 方法/属性 | 说明 | 示例 |
|---|---|---|
group() |
返回整个匹配的字符串 |
ret.group() → 'abc'
|
group(n) |
返回第n个捕获组的内容 |
|
groups() |
返回所有捕获组的元组 |
ret.groups() → ('1', '2')
|
start() |
匹配的起始位置 |
ret.start() → 0
|
end() |
匹配的结束位置 |
ret.end() → 5 |
span() |
返回匹配范围 (start, end)
|
ret.span() → (0, 2)
|
2.3 编译标志(flags 参数)
| 标志 |
简写 | 说明 | 示例 |
|---|---|---|---|
re.IGNORECASE |
re.I |
忽略大小写 | re.search(r'abc', 'ABC', re.I) |
re.MULTILINE |
re.M |
多行模式(影响 ^ 和 $) |
re.findall(r'^\d+', '1\n2', re.M) → ['1', '2']
|
re.DOTALL |
re.S |
让 . 匹配包括换行符的所有字符 |
re.search(r'a.*b', 'a\nb', re.S) |
re.ASCII |
无 | 让 \w, \W 等仅匹配ASCII字符 |
re.search(r'\w+', 'こん', re.ASCII) → 无匹配 |
re.VERBOSE |
re.X |
允许正则中添加注释和空格 | re.***pile(r'''\d+ # 匹配数字''', re.X) |
2.4 re模块核心函数
re.***plie() -预编译正则表达式
在需要多次使用同一个模式时,先将其编译成一个正则表达式对象(Pattern Object),可以显著提高效率。
import re
# 未编译模式,每次调用都要重新编译
result1 = re.match(r"\d+", "123abc")
result2 = re.search(r"\d+", "abc123")
# 编译模式,一次编译,多次使用
pattern = re.***pile(r"\d+")
result1 = pattern.match("123abc")
result2 = pattern.search("abc123")
# 编译后的对象同样拥有 match, search, findall, sub, split 等方法
results_all = pattern.findall("a1b23c456")
何时使用: 当一个模式需要被重复使用上百次或上千次时,预编译的性能优势才会比较明显。对于简单脚本或单次使用,直接使用 re 模块的函数更简洁。
re.fullmatch() - 整个字符串完全匹配
检查整个字符串是否完全匹配给定的模式。可以理解为模式就是整个字符串的定义。
import re
pattern = r"\d{3}" # 匹配3位数字
text1 = "123"
text2 = "123a"
result1 = re.fullmatch(pattern, text1) # 匹配成功
result2 = re.fullmatch(pattern, text2) # 匹配失败,因为字符串不是纯粹的3位数字
if result1:
print(f"'{text1}' 完全由3位数字组成")
# 输出: '123' 完全由3位数字组成
re.match() - 从字符串起始位置匹配
import re
pattern = r"hello"
text = "hello world"
result = re.match(pattern, text)
if result:
print("匹配成功:", result.group())
else:
print("匹配失败")
re.search() - 扫描整个字符串查找匹配
pattern = r"world"
text = "hello world"
result = re.search(pattern, text)
if result:
print("找到匹配:", result.group())
print("起始位置:", result.start())
print("结束位置:", result.end())
re.findall() - 查找所有匹配项
pattern = r"\d+" # 匹配一个或多个数字
text = "我有3个苹果和15个橘子"
results = re.findall(pattern, text)
print("所有数字:", results) # 输出: ['3', '15']
re.finditer() - 返回匹配项的迭代器
pattern = r"\w+"
text = "Hello world, Python regex!"
for match in re.finditer(pattern, text):
print(f"找到 '{match.group()}' 在位置 {match.start()}-{match.end()}")
re.sub() - 字符串替换
pattern = r"apple"
text = "I have an apple and another apple"
new_text = re.sub(pattern, "orange", text)
print(new_text) # 输出: I have an orange and another orange
re.split() - 根据模式分割字符串
pattern = r"\s+" # 一个或多个空白字符
text = "Hello world from Python"
parts = re.split(pattern, text)
print(parts) # 输出: ['Hello', 'world', 'from', 'Python']
三、注意事项
-
尽量使用具体而不是模糊的模式
-
避免过度使用回溯
-
考虑预编译常用模式
-
使用注释和 verbose 模式
-
将复杂模式分解为多个简单模式
-
添加详细的注释
-
根据需求选择合适的函数(match、search、findall等)
-
合理使用正则表达式语法元字符
-
对于复杂或频繁使用的模式,考虑预编译
-
注意性能问题,避免过度复杂的模式
-
使用verbose模式和注释提高可读性
参考
-
Python官方re模块文档
-
正则表达式可视化工具
-
Python re 模块 | 菜鸟教程