Python 正则表达式入门教程

# 一、正则表达式基础概念

正则表达式(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(忽略大小写)

```


五、注意事项与最佳实践

  1. **使用原始字符串**:正则表达式前加`r`,避免转义字符问题

  2. **先测试再使用**:复杂正则建议先用在线工具测试

  3. **适度使用**:过于复杂的正则可读性差,考虑分步骤处理

  4. **贪婪与非贪婪**:`*`、`+`默认贪婪匹配,加`?`变为非贪婪(`*?`、`+?`)

  5. **编译正则**:多次使用的正则可先用`re.compile()`编译,提高效率

```python

编译正则表达式(推荐重复使用时)

pattern = re.compile(r'\d+')

result1 = pattern.findall('数字123,数字456')

result2 = pattern.findall('价格99元,数量10个')

```


**总结**:正则表达式是Python文本处理的利器,掌握基础语法和常用函数,就能解决大部分文本处理问题。建议从简单场景开始练习,逐步掌握更复杂的用法。

相关推荐
gihigo19981 小时前
基于蒙特卡洛的异常值剔除(RANSAC + MC置信区间)—MATLAB实现
开发语言·算法·matlab
Ting.~2 小时前
在java中接入百度地图
java·开发语言·dubbo
小短腿的代码世界2 小时前
Qt对象树析构链与智能指针协同:零泄漏内存管理架构
开发语言·qt·架构
copyer_xyf2 小时前
Agent Tool 调用
后端·python·agent
zhaqonianzhu2 小时前
LOL切回桌面问题,采用监控抓出元凶方式
开发语言
Aurorar0rua2 小时前
CS50 x 2024 Notes Arrays - 04
c语言·开发语言·学习方法
Amo Xiang2 小时前
SpiderDemo 第5题:OB混淆实战 —— 反调试绕过与 signature 签名还原
python·js逆向·爬虫逆向·反调试·spiderdemo·ob混淆
copyer_xyf2 小时前
Agent 结构化输出
后端·python·agent
FBI HackerHarry浩2 小时前
Ollama如何安装到D盘
python·ai