Python中的正则表达式

Python中的正则表达式

本文介绍了Python中的正则表达式。

我们将涵盖广泛的话题,从re模块的基本用法到复杂的正则表达式模式匹配。

YouTube Video

Python中的正则表达式

re 模块用于通过正则表达式搜索和操作字符串。

什么是re模块?

re模块包含在Python的标准库中,提供了使用正则表达式操作字符串的功能。正则表达式用于高效地查找、提取或替换特定的字符串模式。

基本正则表达式模式

正则表达式使用特殊符号定义模式。以下是一些基本模式。

  • .: 任意单个字符
  • ^: 字符串的开头
  • $: 字符串的结尾
  • \d: 任意数字(0-9)
  • \w: 任意单词字符(a-z, A-Z, 0-9, _)
  • \s: 任意空白字符
  • *: 零次或多次重复
  • +: 一次或多次重复
  • []: 字符类(例如,[a-z] 匹配小写字母)
 1import re
 2
 3pattern = r"\d{3}-\d{4}"
 4text = "My postal code is 123-4567."
 5result = re.search(pattern, text)
 6if result:
 7    print(result.group())  # Output: 123-4567
 8
 9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18    print("Matched:", result.group())
19else:
20    print("No match")
  • 该代码首先检查字符串是否匹配邮政编码的模式。接着,它检查整个字符串(从开始到结束)是否匹配由一个单词、空白、数字、空白和一个英文单词组成的模式。这有助于你理解正则表达式的基本元素如何组合使用。

如何使用匹配功能

re.match()

re.match() 检查字符串的开头是否与指定模式匹配。

1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7    print(match.group())  # Output: Python
  • 该代码检查字符串是否以单词字符(字母数字或下划线)开头。第一个单词 'Python' 匹配该模式并被输出。

re.search()

re.search() 会扫描整个字符串并返回第一个匹配结果。

1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7    print(search.group())  # Output: powerful
  • 该代码在整个字符串中搜索单词 'powerful',并返回第一个匹配项。因此,re.search() 输出匹配到的字符串 'powerful'。

re.findall()

re.findall() 会以列表形式返回所有符合模式的匹配结果。

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches)  # Output: ['Python', 'strong']
  • 该代码查找所有恰好为六个字符的单词,并将其作为列表返回。字符串中的 'Python' 符合条件,输出列表 ['Python']

re.finditer()

re.finditer() 会以迭代器形式返回所有匹配结果,方便获取每个匹配项的详细信息。

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7    print(match.group())  # Output: Python
  • 该代码按顺序搜索所有六个字母的单词,并通过迭代器处理每个匹配。这里 'Python' 匹配该模式并被输出。

替换和分割

re.sub()

re.sub() 用另一个字符串替换匹配正则表达式的部分字符串。

1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text)  # Output: There are many apples
  • 该代码将字符串中的所有数字替换为 'many'。

re.split()

re.split() 按照匹配正则表达式的部分对字符串进行分割。

1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts)  # Output: ['Python', 'is', 'powerful']
  • 该代码按一个或多个空白字符拆分字符串。因此,字符串被拆分为单词,得到 ['Python', 'is', 'powerful']

分组和捕获

使用正则表达式分组可以轻松提取匹配到的子字符串。用括号 () 包围可以将其捕获为一个组。

1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7    print(match.group(1))  # Output: 123
8    print(match.group(2))  # Output: 4567
  • 该代码从形如 '123-4567' 的邮政编码中,将3位数和4位数分别提取为独立的分组。group(1) 返回前三位数字 '123',而 group(2) 返回后四位数字 '4567'。

命名分组

使用命名分组可以让你通过有意义的名称而不是索引来获取值。下面是一个从日志中提取日期和级别的具体示例。

1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8    print(m.group("date"), m.group("time"), m.group("level"))
9    print("message:", m.group("msg"))
  • 该代码使用命名分组从日志字符串中提取日期、时间、级别和消息。它通过有意义的名称而非索引来获取这些值。

使用标志选项

re 模块提供多个标志选项来控制搜索行为。

  • re.IGNORECASE (re.I): 一个标志选项,用于使匹配忽略大小写。
  • re.MULTILINE (re.M): 一个标志选项,用于跨多行进行匹配。
  • re.DOTALL (re.S): 一个标志选项,使点号 . 也能匹配换行符。
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7    print(match.group())  # Output: Python
  • 该代码不区分大小写地搜索单词 'python'。通过使用 re.IGNORECASE 标志,它也会匹配 'Python'。

正则表达式对象(re.compile)的优势

使用 re.compile 编译模式可使其重复使用更高效,并提升可读性。你也可以在这里设置标志位。

以下示例使用已编译的模式在多行中反复搜索匹配项。如果你频繁使用相同的模式,用 re.compile 将其编译可提升性能。

1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7    print(m.groups())
  • 该代码使用已编译的正则表达式从多行文本中提取用户名和ID。在重复使用相同模式时,re.compile 提高了效率,也让代码更易读。

应用场景

例如,可以编写一个脚本来从文本文件中提取所有电子邮件地址。

1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails)  # Output: ['info@example.com', 'support@service.com']
  • 该代码查找字符串中的所有电子邮件地址,并将它们提取为列表。

结论

re 模块是 Python 中一个强大的字符串操作工具。在此,我们涵盖了从基本用法到高级正则表达式,包括分组和标志选项的使用。Python的正则表达式非常强大,是文本处理不可缺少的工具。

您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。

YouTube Video