目录
2.2.1 re.compile(pattern, flags=0)
2.2.2 re.search(pattern, string, flags=0)
2.2.3 re.match(pattern, string, flags=0)
2.2.4 re.findall(pattern, string, flags=0)
2.2.5 re.finditer(pattern, string, flags=0)
2.2.6 re.sub(pattern, repl, string, count=0, flags=0)
2.2.7 re.split(pattern, string, maxsplit=0, flags=0)
正则表达式(Regular Expressions, 简称 regex 或 regexp)是一种用于匹配字符串的强大工具。在 Python 中,正则表达式主要通过 re
模块来实现。re
模块提供了多种方法来处理正则表达式,如查找、替换、分割字符串等。
1. 基本概念
1.1 字符类
- 普通字符:直接匹配该字符。
.
:匹配任意一个字符(除了换行符)。\d
:匹配数字。\w
:匹配字母或数字或下划线。\s
:匹配空白字符。[abc]
:匹配字符集合中的任意一个字符。[^abc]
:匹配不在字符集合中的任意一个字符。
1.2 量词
*
:匹配前面的表达式零次或多次。+
:匹配前面的表达式一次或多次。?
:匹配前面的表达式零次或一次。{m}
:匹配前面的表达式恰好 m 次。{m,n}
:匹配前面的表达式至少 m 次,最多 n 次。
1.3 转义字符
\b
:单词边界。\B
:非单词边界。\A
:字符串的开头。\Z
:字符串的结尾。\z
:字符串的结尾(不包括可能存在的换行符)。\G
:前一个匹配的结尾位置。
1.4 分组和引用
(...)
:定义一个捕获组。\1
:引用第 1 个捕获组的内容。(?:...)
:非捕获组,不保存匹配结果。
1.5 贪婪与非贪婪
默认情况下,量词是贪婪的(尽可能多地匹配),加上 ?
变成非贪婪(尽可能少地匹配)。
2. re
模块的基本用法
2.1 导入 re
模块
python
深色版本
1import re
2.2 常用方法
2.2.1 re.compile(pattern, flags=0)
编译正则表达式模式,返回一个模式对象,可以多次使用该模式对象进行匹配。
python
深色版本
1pattern = re.compile(r'\d+') # 编译模式
2result = pattern.search('abc123') # 使用模式对象
3print(result.group()) # 输出: 123
2.2.2 re.search(pattern, string, flags=0)
在整个字符串中查找第一个匹配的位置,返回一个匹配对象。
python
深色版本
1match = re.search(r'\d+', 'abc123xyz')
2if match:
3 print(match.group()) # 输出: 123
2.2.3 re.match(pattern, string, flags=0)
仅在字符串的起始位置进行匹配,返回一个匹配对象。
python
深色版本
1match = re.match(r'\d+', '123abc')
2if match:
3 print(match.group()) # 输出: 123
2.2.4 re.findall(pattern, string, flags=0)
查找所有非重叠的匹配项,返回一个列表。
python
深色版本
1matches = re.findall(r'\d+', 'abc123xyz456')
2print(matches) # 输出: ['123', '456']
2.2.5 re.finditer(pattern, string, flags=0)
查找所有非重叠的匹配项,返回一个迭代器。
python
深色版本
1for match in re.finditer(r'\d+', 'abc123xyz456'):
2 print(match.group())
3# 输出:
4# 123
5# 456
2.2.6 re.sub(pattern, repl, string, count=0, flags=0)
将字符串中的所有匹配项替换为指定字符串。
python
深色版本
1result = re.sub(r'\d+', '[REDACTED]', 'abc123xyz456')
2print(result) # 输出: abc[REDACTED]xyz[REDACTED]
2.2.7 re.split(pattern, string, maxsplit=0, flags=0)
根据匹配项分割字符串,返回一个列表。
python
深色版本
1parts = re.split(r'\d+', 'abc123xyz456')
2print(parts) # 输出: ['abc', 'xyz', '']
3. 示例
3.1 验证电子邮件地址
python
深色版本
1import re
2
3email_pattern = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)"
4email = "example@example.com"
5
6if re.match(email_pattern, email):
7 print("Valid email address.")
8else:
9 print("Invalid email address.")
3.2 提取 HTML 标签内的文本
python
深色版本
1html = '<html><head><title>Title</title></head><body>Content here</body></html>'
2content = re.findall(r'<[^>]*>([^<>]*)</[^>]*>', html)
3print(content) # 输出: ['Title', 'Content here']
4. 进阶用法
4.1 条件匹配
使用条件表达式 (?(id/name)yes-pattern|no-pattern)
可以根据前面的匹配结果来决定接下来的模式。
python
深色版本
1pattern = r'(Mr|Mrs)\.? (\w+)'
2text = 'Mr. Smith and Mrs. Jones'
3
4result = re.findall(pattern, text)
5print(result) # 输出: [('Mr', 'Smith'), ('Mrs', 'Jones')]
4.2 前瞻和回顾断言
使用前瞻断言 (?=...)
和回顾断言 (?<=...)
可以检查位置前后是否有特定的模式,而不消耗这些字符。
python
深色版本
1text = "This is a sample text with some words."
2words = re.findall(r'\b\w+(?= )', text)
3print(words) # 输出: ['This', 'is', 'a', 'sample', 'with', 'some']
5. 总结
正则表达式是 Python 中处理文本数据的强大工具,通过 re
模块可以方便地进行字符串的查找、替换、分割等操作。掌握了基本的正则表达式语法和 re
模块的方法,可以极大地提高文本处理的效率和灵活性。