# 一、正则表达式基础概念
正则表达式(Regular Expression,简称Regex或RE)是一种强大的文本处理工具,它使用特定的语法规则来描述、匹配和搜索字符串模式。无论是验证用户输入、提取关键信息,还是批量替换文本,正则表达式都能高效完成。
1.1 什么是正则表达式
正则表达式是由普通字符(如字母、数字)和特殊字符(元字符)组成的字符串,它定义了一种搜索模式。通过这种模式,我们可以:
-
验证字符串是否符合特定格式(如邮箱、手机号)
-
从文本中提取特定内容
-
批量替换符合规则的文本
-
分割字符串
1.2 正则表达式的应用场景
-
**表单验证**:邮箱、手机号、身份证号等格式校验
-
**数据爬取**:从HTML/JSON中提取目标数据
-
**文本处理**:批量查找替换、日志分析
-
**IDE编辑器**:高级查找替换功能
二、Python re模块常用函数
Python通过内置的`re`模块提供正则表达式支持。下面介绍最常用的几个函数。
2.1 re.match() - 从字符串开头匹配
```python
import re
匹配开头是否为Python
result = re.match(r'Python', 'Python正则表达式教程')
print(result.group()) # 输出: Python
```
**特点**:只从字符串**开头**开始匹配,匹配成功返回匹配对象,失败返回None。
2.2 re.search() - 搜索整个字符串
```python
在整个字符串中搜索
result = re.search(r'正则', 'Python正则表达式教程')
print(result.group()) # 输出: 正则
```
**特点**:扫描整个字符串,返回**第一个**匹配的结果。
2.3 re.findall() - 查找所有匹配
```python
找出所有数字
text = '今天是2024年,月薪15000元'
results = re.findall(r'\d+', text)
print(results) # 输出: '2024', '15000'
```
**特点**:返回**所有**匹配结果的列表。
2.4 re.sub() - 替换匹配内容
```python
将所有数字替换为*
text = '手机号:13812345678,密码:123456'
result = re.sub(r'\d', '*', text)
print(result) # 输出: 手机号:***********,密码:******
```
2.5 re.split() - 按正则分割字符串
```python
按多种分隔符分割
text = 'a,b;c d'
result = re.split(r',; ', text)
print(result) # 输出: 'a', 'b', 'c', 'd'
```
三、常用正则语法
3.1 元字符(特殊字符)
| 元字符 | 说明 | 示例 |
|--------|------|------|
| `.` | 匹配任意单个字符(除换行符) | `a.b` 匹配 aab、acb、a1b |
| `^` | 匹配字符串开头 | `^Hello` 匹配以Hello开头的字符串 |
| `\` \| 匹配字符串结尾 \| \`world` 匹配以world结尾的字符串 |
| `*` | 匹配前一个字符0次或多次 | `ab*` 匹配 a、ab、abb、abbb |
| `+` | 匹配前一个字符1次或多次 | `ab+` 匹配 ab、abb、abbb |
| `?` | 匹配前一个字符0次或1次 | `ab?` 匹配 a、ab |
| `{n}` | 匹配前一个字符恰好n次 | `a{3}` 匹配 aaa |
| `{n,}` | 匹配前一个字符至少n次 | `a{2,}` 匹配 aa、aaa、aaaa... |
| `{n,m}` | 匹配前一个字符n到m次 | `a{2,4}` 匹配 aa、aaa、aaaa |
3.2 字符类
| 语法 | 说明 |
|------|------|
| `abc` | 匹配a、b、c中任意一个字符 |
| `\^abc` | 匹配除a、b、c外的任意字符 |
| `a-z` | 匹配任意小写字母 |
| `A-Z` | 匹配任意大写字母 |
| `0-9` | 匹配任意数字 |
| `a-zA-Z0-9` | 匹配任意字母数字 |
3.3 预定义字符集
| 语法 | 说明 | 等价于 |
|------|------|--------|
| `\d` | 匹配任意数字 | `0-9` |
| `\D` | 匹配任意非数字 | `\^0-9` |
| `\w` | 匹配字母数字下划线 | `a-zA-Z0-9_` |
| `\W` | 匹配非字母数字下划线 | `\^a-zA-Z0-9_` |
| `\s` | 匹配任意空白字符(空格、制表符、换行符) | |
| `\S` | 匹配任意非空白字符 | |
3.4 分组与捕获
使用`()`进行分组:
```python
提取区号和电话号码
text = '电话:010-12345678'
result = re.search(r'(\d{3})-(\d{8})', text)
print(result.group(1)) # 区号: 010
print(result.group(2)) # 号码: 12345678
print(result.groups()) # 所有分组: ('010', '12345678')
```
四、实战示例
4.1 验证邮箱格式
```python
def is_valid_email(email):
pattern = r'^a-zA-Z0-9._%+-+@a-zA-Z0-9.-+\.a-zA-Z{2,}$'
return re.match(pattern, email) is not None
测试
print(is_valid_email('test@example.com')) # True
print(is_valid_email('invalid-email')) # False
print(is_valid_email('user.name@domain.cn')) # True
```
4.2 验证手机号
```python
def is_valid_phone(phone):
pattern = r'^13-9\d{9}$'
return re.match(pattern, phone) is not None
测试
print(is_valid_phone('13812345678')) # True
print(is_valid_phone('12345678901')) # False(12开头)
print(is_valid_phone('1381234567')) # False(位数不够)
```
4.3 提取URL中的域名
```python
def extract_domain(url):
pattern = r'https?://(\^/+)'
result = re.search(pattern, url)
return result.group(1) if result else None
测试
print(extract_domain('https://blog.csdn.net/article/123')) # blog.csdn.net
print(extract_domain('http://www.example.com/path')) # www.example.com
```
4.4 隐藏身份证号中间部分
```python
def mask_id_card(id_card):
保留前6位和后4位,中间用*代替
return re.sub(r'(\d{6})\d{8}(\d{4})', r'\1********\2', id_card)
print(mask_id_card('110101199001011234')) # 110101********1234
```
4.5 统计文本中单词出现次数
```python
def count_word(text, word):
使用\b确保匹配完整单词
pattern = rf'\b{word}\b'
matches = re.findall(pattern, text, re.IGNORECASE)
return len(matches)
text = 'Python is great. I love Python. python is easy!'
print(count_word(text, 'python')) # 3(忽略大小写)
```
五、注意事项与最佳实践
-
**使用原始字符串**:正则表达式前加`r`,避免转义字符问题
-
**先测试再使用**:复杂正则建议先用在线工具测试
-
**适度使用**:过于复杂的正则可读性差,考虑分步骤处理
-
**贪婪与非贪婪**:`*`、`+`默认贪婪匹配,加`?`变为非贪婪(`*?`、`+?`)
-
**编译正则**:多次使用的正则可先用`re.compile()`编译,提高效率
```python
编译正则表达式(推荐重复使用时)
pattern = re.compile(r'\d+')
result1 = pattern.findall('数字123,数字456')
result2 = pattern.findall('价格99元,数量10个')
```
**总结**:正则表达式是Python文本处理的利器,掌握基础语法和常用函数,就能解决大部分文本处理问题。建议从简单场景开始练习,逐步掌握更复杂的用法。