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文本处理的利器,掌握基础语法和常用函数,就能解决大部分文本处理问题。建议从简单场景开始练习,逐步掌握更复杂的用法。

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
二十雨辰6 小时前
[爬虫]-Urllib
爬虫·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
玉鸯7 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_446260858 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao8 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest