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频道。