授课语音

Python 中的正则表达式(re 模块)

正则表达式是用于字符串处理的强大工具,可以通过模式匹配来查找、替换、分割字符串。Python 提供了 re 模块来实现正则表达式的功能。掌握正则表达式不仅能提高处理文本数据的效率,还能在各种编程任务中起到关键作用。


1. 正则表达式的基础概念

什么是正则表达式?

正则表达式(Regular Expression)是一种通过某种规则(模式)匹配字符串的工具。它能够高效地进行文本搜索、替换、分割等操作。

常用的正则表达式符号:

  • .:匹配除换行符之外的任何字符。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • []:匹配括号中的任意一个字符。
  • |:匹配左边或右边的表达式。
  • *:匹配前面的字符 0 次或多次。
  • +:匹配前面的字符 1 次或多次。
  • ?:匹配前面的字符 0 次或 1 次。
  • \d:匹配数字(0-9)。
  • \w:匹配字母、数字和下划线。
  • \s:匹配空白字符(如空格、制表符等)。

2. re 模块常用函数

(1) re.match()

re.match() 从字符串的开头开始匹配正则表达式。如果正则表达式的模式匹配成功,返回一个匹配对象;如果不成功,返回 None

代码示例:

import re

# 使用 match() 检查字符串开头是否符合正则表达式
result = re.match(r'hello', 'hello world')

# 如果匹配成功,返回一个匹配对象
if result:
    print("匹配成功:", result.group())
else:
    print("匹配失败")

(2) re.search()

re.search() 会扫描整个字符串,返回第一个匹配的结果。如果有多个匹配,只返回第一个匹配项。

代码示例:

import re

# 使用 search() 在整个字符串中查找第一次出现的匹配项
result = re.search(r'world', 'hello world, world!')

# 如果匹配成功,返回一个匹配对象
if result:
    print("匹配成功:", result.group())
else:
    print("匹配失败")

(3) re.findall()

re.findall() 返回字符串中所有匹配正则表达式的部分,返回一个列表。如果没有匹配项,返回空列表。

代码示例:

import re

# 使用 findall() 查找所有匹配的项
result = re.findall(r'\d+', 'abc 123 def 456 ghi 789')

# 输出所有数字字符串
print("所有匹配项:", result)  # 输出 ['123', '456', '789']

(4) re.sub()

re.sub() 用于替换字符串中所有匹配正则表达式的部分,可以指定替换内容。

代码示例:

import re

# 使用 sub() 替换所有匹配的部分
result = re.sub(r'\d+', '数字', 'abc 123 def 456 ghi 789')

# 输出替换后的字符串
print("替换后的字符串:", result)  # 输出 abc 数字 def 数字 ghi 数字

(5) re.split()

re.split() 根据正则表达式分割字符串,返回一个列表。

代码示例:

import re

# 使用 split() 根据正则表达式分割字符串
result = re.split(r'\s+', 'hello   world   python')

# 输出分割后的结果
print("分割后的字符串:", result)  # 输出 ['hello', 'world', 'python']

3. 正则表达式的进阶用法

(1) 分组(Group)

通过使用括号 () 可以定义一个正则表达式的分组。分组的作用是将正则表达式的一部分作为一个单元来进行匹配,分组之后,可以通过 group() 方法访问匹配到的内容。

代码示例:

import re

# 使用分组匹配并提取子匹配内容
result = re.match(r'(\d+)-(\d+)', '2024-12')

if result:
    # 访问第一个分组和第二个分组
    print("第一个分组:", result.group(1))  # 输出 '2024'
    print("第二个分组:", result.group(2))  # 输出 '12'

(2) 贪婪模式与懒惰模式

  • 贪婪模式:正则表达式默认采用贪婪模式,即尽可能匹配更多的字符。
  • 懒惰模式:通过在量词后加 ?,可以将其变为懒惰模式,尽可能匹配更少的字符。

代码示例:

import re

# 贪婪模式
result = re.findall(r'<.*>', '<a>1</a><b>2</b>')

print("贪婪模式匹配结果:", result)  # 输出 ['<a>1</a><b>2</b>']

# 懒惰模式
result_lazy = re.findall(r'<.*?>', '<a>1</a><b>2</b>')

print("懒惰模式匹配结果:", result_lazy)  # 输出 ['<a>1</a>', '<b>2</b>']

(3) 原子匹配和非捕获分组

使用 (?:...) 可以定义非捕获分组,它不会返回匹配的子串,只用于控制匹配。

代码示例:

import re

# 使用非捕获分组进行匹配
result = re.match(r'(\d+)(?:-\d+)', '123-456')

if result:
    print("匹配的第一个数字:", result.group(1))  # 输出 '123'

4. 总结

函数 功能 示例
re.match() 从字符串开头匹配正则表达式 re.match(r'hello', 'hello world')
re.search() 扫描整个字符串,查找第一次匹配的项 re.search(r'world', 'hello world')
re.findall() 查找所有匹配的项,返回列表 re.findall(r'\d+', 'abc 123 def 456')
re.sub() 替换匹配的内容 re.sub(r'\d+', '数字', 'abc 123')
re.split() 根据正则表达式分割字符串 re.split(r'\s+', 'hello world')

正则表达式在 Python 中是一个非常强大的工具,能够帮助我们高效地处理字符串操作。在实际开发中,掌握 re 模块的基本函数和正则表达式的语法是非常重要的。

去1:1私密咨询

系列课程: