本文目录导读:
Python 的 re 模块(正则表达式)提供了多种强大的方法用于字符串的模式匹配、搜索、替换和分割,以下是其中最常用的方法,按功能分类说明:
核心搜索与匹配方法
-
re.match(pattern, string, flags=0)- 作用:从字符串的 起始位置 开始匹配模式,如果起始位置匹配成功,返回一个
Match对象;否则返回None。 - 注意:它只检查字符串开头,不检查整个字符串。
- 示例:
import re result = re.match(r'\d+', '123abc') print(result.group()) # 输出: 123
- 作用:从字符串的 起始位置 开始匹配模式,如果起始位置匹配成功,返回一个
-
re.search(pattern, string, flags=0)- 作用:扫描 整个字符串,找到第一个匹配模式的位置,返回第一个
Match对象,找不到返回None。 - 示例:
result = re.search(r'\d+', 'abc123def456') print(result.group()) # 输出: 123 (第一个数字)
- 作用:扫描 整个字符串,找到第一个匹配模式的位置,返回第一个
-
re.findall(pattern, string, flags=0)- 作用:找到字符串中所有符合模式的子串,以 列表 形式返回,如果没有匹配则返回空列表。
- 示例:
result = re.findall(r'\d+', 'abc123def456') print(result) # 输出: ['123', '456']
-
re.finditer(pattern, string, flags=0)- 作用:与
findall类似,但返回一个包含所有匹配结果的 迭代器(每个元素是一个Match对象),适合处理大量匹配时节省内存。 - 示例:
for match in re.finditer(r'\d+', 'a1b2c3'): print(match.group()) # 依次输出: 1, 2, 3
- 作用:与
字符串替换方法
-
re.sub(pattern, repl, string, count=0, flags=0)-
作用:将字符串中所有匹配
pattern的子串替换为repl。count指定最多替换次数,默认为 0(全部替换)。 -
repl可以是字符串或函数:函数接收Match对象作为参数,返回替换字符串。 -
示例:
# 基本替换 text = "hello 123 world 456" result = re.sub(r'\d+', 'NUMBER', text) print(result) # 输出: hello NUMBER world NUMBER # 使用函数动态替换 def replace_func(match): return str(int(match.group()) * 2) result = re.sub(r'\d+', replace_func, text) print(result) # 输出: hello 246 world 912
-
-
re.subn(pattern, repl, string, count=0, flags=0)- 作用:与
sub功能完全相同,但返回一个 元组(新字符串, 替换次数)。 - 示例:
result, count = re.subn(r'\d+', 'NUM', 'a1b2c3') print(result) # 输出: aNUMbNUMcNUM print(count) # 输出: 3
- 作用:与
字符串分割方法
-
re.split(pattern, string, maxsplit=0, flags=0)-
作用:按照匹配
pattern的子串来分割字符串,返回一个 列表。maxsplit指定最大分割次数,0 表示不限制。 -
示例:
text = "apple, orange; banana | grape" # 按逗号、分号、竖线或空格分割 result = re.split(r'[;,| ]+', text) print(result) # 输出: ['apple', 'orange', 'banana', 'grape'] # 限制分割 2 次 result2 = re.split(r'[;,| ]+', text, maxsplit=2) print(result2) # 输出: ['apple', 'orange', 'banana | grape']
-
编译与性能优化方法
re.compile(pattern, flags=0)- 作用:将正则表达式模式编译成一个 正则表达式对象,该对象拥有
match、search、findall、sub等方法,重复使用同一模式时效率更高。 - 示例:
pattern = re.compile(r'\d+') result1 = pattern.findall('abc123') # ['123'] result2 = pattern.search('xyz456') # 匹配对象
- 作用:将正则表达式模式编译成一个 正则表达式对象,该对象拥有
常用标志(flags)
所有方法都可以通过 flags 参数调整匹配行为,常用标志有:
| 标志 | 缩写 | 含义 |
|---|---|---|
re.I |
re.IGNORECASE |
忽略大小写 |
re.M |
re.MULTILINE |
多行模式, 匹配每行开头, 匹配每行结尾 |
re.S |
re.DOTALL |
让 匹配包括换行符在内的所有字符 |
re.X |
re.VERBOSE |
允许正则表达式中添加空白和注释,提高可读性 |
综合示例
import re
# 编译一个忽略大小写的模式
pattern = re.compile(r'\bpython\b', re.I)
text = "Python is great. I love python and PYTHON."
# 搜索第一个
match = pattern.search(text)
if match:
print(f"Found: {match.group()} at position {match.start()}") # Found: Python at position 0
# 查找所有
all_matches = pattern.findall(text)
print(all_matches) # ['Python', 'python', 'PYTHON']
# 替换
new_text = pattern.sub('Java', text)
print(new_text) # "Java is great. I love Java and Java."
# 分割
parts = re.split(r'[.!\s]+', text)
print(parts) # ['Python', 'is', 'great', 'I', 'love', 'python', 'and', 'PYTHON', '']
- 最常用:
search(找第一个)、findall(找所有)、sub(替换)、split(分割)。 - 查找:
match只查开头,search查全文,findall查全部返回列表,finditer查全部返回迭代器。 - 建议:如果同一正则多次使用,先
compile提高效率;处理复杂替换逻辑时,使用函数作为sub的repl参数。