1. 主页
  2. 文档
  3. Python教程
  4. Python 高级
  5. 正则表达式

正则表达式

正则表达式(Regular Expressions,简称regex)是用于在文本中搜索和替换模式的强大工具。在Python中,正则表达式的功能由内置的re模块提供,它能帮助开发者有效地处理字符串。本文旨在详细介绍Python中正则表达式的使用方法,包括基本匹配、模式语法、常用函数以及实际应用示例。

基本概念和语法

类别 字符 描述
字面字符 abc 直接匹配字符abc
通配符 . 匹配除换行符外的任意单个字符
锚点 ^ 匹配字符串的开头
$ 匹配字符串的结尾
数量词 * 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次
{n} 匹配前面的子表达式恰好n
{n,} 匹配前面的子表达式至少n
{n,m} 匹配前面的子表达式至少n次,最多m
字符类 [abc] 匹配任何一个位于括号内的字符
[^abc] 匹配任何不在括号内的字符
特殊字符 \d 匹配任何数字,等同于[0-9]
\D 匹配任何非数字字符,等同于[^0-9]
\s 匹配任何空白字符,包括空格、制表符、换行符等
\S 匹配任何非空白字符
\w 匹配任何字母数字字符,等同于[a-zA-Z0-9_]
\W 匹配任何非字母数字字符
转义符 \\ 用于转义特殊字符

常用函数

re.match()

检查字符串的开头是否与正则表达式匹配。

import re

pattern = r'\d+'
text = "123abc"
match = re.match(pattern, text)
if match:
    print(match.group())  # 输出: 123

re.search()

在整个字符串中搜索与正则表达式匹配的部分。

text = "Hello 123 world"
match = re.search(r'\d+', text)
if match:
    print(match.group())  # 输出: 123

re.findall()

返回字符串中所有与正则表达式匹配的部分。

text = "Hello 123 world 456"
matches = re.findall(r'\d+', text)
print(matches)  # 输出: ['123', '456']

re.sub()

替换字符串中的正则表达式匹配项。

text = "Hello 123 world 456"
replaced_text = re.sub(r'\d+''number', text)
print(replaced_text)  # 输出: Hello number

 world number

实践应用

1. 数据验证

正则表达式常用于验证输入数据的格式,比如电子邮件、电话号码、URL等。

示例:验证电子邮件地址

import re

email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
email = "example@email.com"

if re.match(email_pattern, email):
    print(f"{email} 是有效的电子邮件地址")
else:
    print(f"{email} 不是有效的电子邮件地址")

2. 日志文件分析

正则表达式能够帮助从日志文件中提取有用信息,如日期、时间、日志级别等。

示例:提取日志文件中的日期和时间

import re

log_entry = "2023-03-29 10:00:00, ERROR, Something went wrong!"
date_time_pattern = r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})'

match = re.search(date_time_pattern, log_entry)
if match:
    print(f"日志时间:{match.group(1)}")

3. 文本解析和数据抽取

在大量文本中抽取特定格式的数据,如代码、标签或特定格式的字符串。

示例:从文本中提取所有URL

import re

text = "Visit our website at https://example.com or follow us on http://twitter.com/example."
urls_pattern = r'https?://[^\s<>"]+|www\.[^\s<>"]+'

urls = re.findall(urls_pattern, text)
print("找到的URL:")
for url in urls:
    print(url)

4. 文本替换和修改

正则表达式也可以用于替换或修改字符串中的文本。

示例:替换文本中的敏感词

import re

text = "This is a secret document. The secret should not be shared."
modified_text = re.sub(r'secret''*****', text)

print(modified_text)

5. 批量文件重命名

正则表达式可以用于批量处理文件名,例如,重命名文件以符合特定的命名约定。

示例:批量重命名文件

假设有一系列的图片文件,名称如img1.png, img2.png, …, img10.png,想要将它们重命名为image_01.png, image_02.png, …, image_10.png,可以使用正则表达式来实现这个批量重命名过程。

import re
import os

files = ['img1.png''img2.png''img10.png']
pattern = r'img(\d+)\.png'

for filename in files:
    match = re.search(pattern, filename)
    if match:
        new_name = f'image_{int(match.group(1)):02d}.png'
        os.rename(filename, new_name)
        print(f'Renamed "{filename}" to "{new_name}"')

6. 文本数据清洗

在数据分析和预处理中,正则表达式常用于清洗和格式化文本数据。

示例:从文本中移除HTML标签

在抓取网页内容时,经常需要从文本中移除HTML标签。

import re

html_text = "<h1>This is a Heading</h1><p>This is a paragraph.</p>"
clean_text = re.sub(r'<.*?>''', html_text)

print(clean_text)

7. 分割复杂字符串

正则表达式的分割功能允许根据复杂的分隔符来分割字符串。

示例:使用多个分隔符分割字符串

有时候需要根据多个不同的字符或模式来分割文本。

import re

text = "Words, separated. by different; punctuations?"
words = re.split(r'[;,\.\s?]+', text)

print(words)


在处理文本数据时,经常需要查找复杂模式或特定的字符序列。例如,在日志分析、数据验证或文本挖掘时,正则表达式是不可或缺的工具。Python的re模块提供了一系列函数,使得执行这些复杂的文本匹配和替换变得简单。

我们要如何帮助您?