Python文件操作与正则表达式实战

Python文件操作与正则表达式实战

【免费下载链接】Hello-Python mouredev/Hello-Python: 是一个用于学习 Python 编程的简单示例项目,包含多个练习题和参考答案,适合用于 Python 编程入门学习。 【免费下载链接】Hello-Python 项目地址: https://gitcode.com/GitHub_Trending/he/Hello-Python

本文全面介绍了Python中文件操作和正则表达式的核心知识与实战技巧。内容涵盖文件读写操作模式详解(包括r、w、a、x等模式及其组合使用),CSV/JSON/TXT三种常见文件格式的处理方法,以及正则表达式的基础语法和高级应用。通过丰富的代码示例和实际场景演示,帮助读者掌握文本处理的完整技能栈,从基础文件操作到复杂的模式匹配与数据提取。

文件读写操作模式详解

Python提供了多种文件操作模式,每种模式都有其特定的用途和适用场景。掌握这些模式对于高效、安全地进行文件操作至关重要。让我们深入探讨Python中主要的文件读写操作模式。

基本文件操作模式

Python的文件操作模式通过open()函数的第二个参数指定,主要包括以下几种:

模式描述文件存在文件不存在文件指针位置
r只读模式打开文件抛出异常文件开头
w写入模式清空内容创建文件文件开头
a追加模式打开文件创建文件文件末尾
x独占创建抛出异常创建文件文件开头
b二进制模式---
t文本模式---
+读写模式---

读写模式组合

在实际应用中,我们经常使用模式组合来满足不同的需求:

# 读写模式示例
file = open("example.txt", "r+")  # 读写模式,文件必须存在
file = open("example.txt", "w+")  # 读写模式,会清空文件内容
file = open("example.txt", "a+")  # 读写模式,追加到文件末尾

模式详解与示例

1. 只读模式 (r)

只读模式用于读取文件内容,不允许修改:

# 读取文本文件
with open("data.txt", "r") as file:
    content = file.read()
    print(content)

# 逐行读取
with open("data.txt", "r") as file:
    for line in file:
        print(line.strip())
2. 写入模式 (w)

写入模式会清空文件原有内容,从头开始写入:

# 写入文本文件
with open("output.txt", "w") as file:
    file.write("第一行内容\n")
    file.write("第二行内容\n")
    
# 写入多行内容
lines = ["第一行", "第二行", "第三行"]
with open("output.txt", "w") as file:
    file.writelines(line + "\n" for line in lines)
3. 追加模式 (a)

追加模式在文件末尾添加内容,不会清空原有数据:

# 追加内容到文件
with open("log.txt", "a") as file:
    import datetime
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    file.write(f"[{timestamp}] 系统启动\n")
4. 读写组合模式

mermaid

二进制模式操作

二进制模式用于处理非文本文件,如图片、音频、视频等:

# 读取二进制文件
with open("image.jpg", "rb") as file:
    image_data = file.read()

# 写入二进制文件
with open("copy.jpg", "wb") as file:
    file.write(image_data)

文件指针操作

文件指针控制读写位置,常用的操作方法:

with open("example.txt", "r+") as file:
    # 获取当前指针位置
    position = file.tell()
    print(f"当前位置: {position}")
    
    # 读取前10个字符
    content = file.read(10)
    print(f"前10个字符: {content}")
    
    # 移动指针到文件开头
    file.seek(0)
    
    # 移动到第5个字节
    file.seek(5)
    
    # 从当前位置向后移动3个字节
    file.seek(3, 1)
    
    # 从文件末尾向前移动5个字节
    file.seek(-5, 2)

实战示例:日志文件处理

class LogHandler:
    def __init__(self, filename):
        self.filename = filename
    
    def read_logs(self):
        """读取日志文件内容"""
        try:
            with open(self.filename, "r") as file:
                return file.readlines()
        except FileNotFoundError:
            return []
    
    def write_log(self, message):
        """写入日志信息"""
        import datetime
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        log_entry = f"[{timestamp}] {message}\n"
        
        with open(self.filename, "a") as file:
            file.write(log_entry)
    
    def clear_logs(self):
        """清空日志文件"""
        with open(self.filename, "w") as file:
            file.write("")  # 写入空内容清空文件

# 使用示例
logger = LogHandler("app.log")
logger.write_log("应用程序启动")
logger.write_log("用户登录成功")
logs = logger.read_logs()
for log in logs:
    print(log.strip())

错误处理与最佳实践

def safe_file_operation(filename, mode, operation):
    """
    安全的文件操作封装
    """
    try:
        with open(filename, mode) as file:
            return operation(file)
    except FileNotFoundError:
        print(f"文件 {filename} 不存在")
        return None
    except PermissionError:
        print(f"没有权限访问文件 {filename}")
        return None
    except IOError as e:
        print(f"文件操作错误: {e}")
        return None

# 使用安全封装读取文件
content = safe_file_operation("data.txt", "r", lambda f: f.read())
if content:
    print("文件内容:", content)

模式选择指南

根据不同的需求场景,选择合适的文件操作模式:

场景推荐模式说明
读取配置文件r只读,避免意外修改
写入临时数据w清空旧内容,写入新数据
记录日志a追加模式,保留历史记录
读写配置文件r+需要文件已存在
创建新数据文件w+读写模式,文件不存在时创建
二进制文件处理rb/wb处理图片、音频等二进制数据

掌握这些文件操作模式,能够帮助你在Python项目中更加灵活和高效地处理文件读写任务。记住始终使用with语句来确保文件正确关闭,避免资源泄漏。

CSV/JSON/TXT文件处理实战

在Python编程中,文件操作是日常开发中不可或缺的重要技能。CSV、JSON和TXT是三种最常见的数据存储格式,每种格式都有其特定的应用场景和处理方式。本文将深入探讨这三种文件格式的Python处理方法,并通过实际代码示例展示如何高效地进行文件读写操作。

CSV文件处理

CSV(Comma-Separated Values)文件是一种以纯文本形式存储表格数据的简单格式,广泛应用于数据交换和数据分析场景。

基本CSV读写操作
import csv

# 写入CSV文件
with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['姓名', '年龄', '城市', '职业'])
    writer.writerow(['张三', 28, '北京', '工程师'])
    writer.writerow(['李四', 32, '上海', '设计师'])
    writer.writerow(['王五', 25, '广州', '产品经理'])

# 读取CSV文件
with open('data.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)
使用字典方式处理CSV
import csv

# 使用DictWriter写入
with open('employees.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['id', 'name', 'department', 'salary']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    writer.writeheader()
    writer.writerow({'id': 1, 'name': '张三', 'department': '技术部', 'salary': 15000})
    writer.writerow({'id': 2, 'name': '李四', 'department': '设计部', 'salary': 12000})
    writer.writerow({'id': 3, 'name': '王五', 'department': '市场部', 'salary': 10000})

# 使用DictReader读取
with open('employees.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(f"{row['name']} - {row['department']}: ¥{row['salary']}")
CSV数据处理的高级技巧
import csv
from collections import defaultdict

# 数据统计示例
def analyze_csv_data(filename):
    department_stats = defaultdict(lambda: {'count': 0, 'total_salary': 0})
    
    with open(filename, 'r', encoding='utf-8') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            dept = row['department']
            salary = float(row['salary'])
            
            department_stats[dept]['count'] += 1
            department_stats[dept]['total_salary'] += salary
    
    # 计算平均薪资
    for dept, stats in department_stats.items():
        avg_salary = stats['total_salary'] / stats['count']
        print(f"{dept}: {stats['count']}人, 平均薪资: ¥{avg_salary:.2f}")

analyze_csv_data('employees.csv')

JSON文件处理

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。

基本JSON读写操作
import json

# 创建示例数据
user_data = {
    "users": [
        {
            "id": 1,
            "name": "张三",
            "email": "zhangsan@example.com",
            "preferences": {
                "theme": "dark",
                "language": "zh-CN",
                "notifications": True
            },
            "roles": ["admin", "user"]
        },
        {
            "id": 2,
            "name": "李四",
            "email": "lisi@example.com",
            "preferences": {
                "theme": "light",
                "language": "en-US",
                "notifications": False
            },
            "roles": ["user"]
        }
    ],
    "metadata": {
        "version": "1.0",
        "created_at": "2024-01-15",
        "total_users": 2
    }
}

# 写入JSON文件
with open('users.json', 'w', encoding='utf-8') as jsonfile:
    json.dump(user_data, jsonfile, ensure_ascii=False, indent=2)

# 读取JSON文件
with open('users.json', 'r', encoding='utf-8') as jsonfile:
    loaded_data = json.load(jsonfile)
    print(f"版本: {loaded_data['metadata']['version']}")
    print(f"用户数量: {loaded_data['metadata']['total_users']}")
    
    for user in loaded_data['users']:
        print(f"用户: {user['name']} - {user['email']}")
JSON数据的复杂操作
import json
from datetime import datetime

# 高级JSON操作示例
class UserManager:
    def __init__(self, filename='users.json'):
        self.filename = filename
        self.users = self.load_users()
    
    def load_users(self):
        try:
            with open(self.filename, 'r', encoding='utf-8') as f:
                return json.load(f)
        except FileNotFoundError:
            return {"users": [], "metadata": {"version": "1.0", "created_at": datetime.now().isoformat()}}
    
    def save_users(self):
        self.users['metadata']['updated_at'] = datetime.now().isoformat()
        with open(self.filename, 'w', encoding='utf-8') as f:
            json.dump(self.users, f, ensure_ascii=False, indent=2)
    
    def add_user(self, name, email, **kwargs):
        new_user = {
            "id": len(self.users['users']) + 1,
            "name": name,
            "email": email,
            "created_at": datetime.now().isoformat(),
            **kwargs
        }
        self.users['users'].append(new_user)
        self.users['metadata']['total_users'] = len(self.users['users'])
        self.save_users()
        return new_user
    
    def find_user_by_email(self, email):
        return next((user for user in self.users['users'] if user['email'] == email), None)

# 使用示例
manager = UserManager()
manager.add_user("王五", "wangwu@example.com", roles=["user"], preferences={"theme": "light"})
user = manager.find_user_by_email("wangwu@example.com")
print(f"找到用户: {user['name']}")

TXT文件处理

纯文本文件是最基础的文件格式,适用于存储简单的文本数据、配置文件、日志文件等。

基本文本文件操作
# 写入文本文件
with open('log.txt', 'w', encoding='utf-8') as txtfile:
    txtfile.write("系统日志文件\n")
    txtfile.write("=" * 20 + "\n")
    txtfile.write("2024-01-15 10:30:15 - 系统启动成功\n")
    txtfile.write("2024-01-15 10:35:22 - 用户登录: zhangsan\n")
    txtfile.write("2024-01-15 10:40:18 - 数据库连接建立\n")

# 读取整个文件
with open('log.txt', 'r', encoding='utf-8') as txtfile:
    content = txtfile.read()
    print("文件内容:")
    print(content)

# 逐行读取
print("\n逐行读取:")
with open('log.txt', 'r', encoding='utf-8') as txtfile:
    for line_num, line in enumerate(txtfile, 1):
        print(f"{line_num}: {line.strip()}")
高级文本处理技巧
import re
from collections import Counter

class LogAnalyzer:
    def __init__(self, filename):
        self.filename = filename
        self.lines = self.read_lines()
    
    def read_lines(self):
        with open(self.filename, 'r', encoding='utf-8') as f:
            return [line.strip() for line in f if line.strip()]
    
    def count_events(self):
        """统计不同类型的事件"""
        events = []
        pattern = r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} - (.*)'
        
        for line in self.lines:
            match = re.search(pattern, line)
            if match:
                events.append(match.group(1))
        
        return Counter(events)
    
    def filter_by_keyword(self, keyword):
        """根据关键词过滤日志"""
        return [line for line in self.lines if keyword.lower() in line.lower()]
    
    def get_timeline(self):
        """获取时间线统计"""
        timeline = {}
        pattern = r'(\d{4}-\d{2}-\d{2}) \d{2}:\d{2}:\d{2}'
        
        for line in self.lines:
            match = re.search(pattern, line)
            if match:
                date = match.group(1)
                timeline[date] = timeline.get(date, 0) + 1
        
        return timeline

# 使用示例
analyzer = LogAnalyzer('log.txt')
print("事件统计:", analyzer.count_events())
print("包含'用户'的日志:", analyzer.filter_by_keyword('用户'))
print("时间线统计:", analyzer.get_timeline())

三种格式的比较与选择

为了更好地理解不同文件格式的特点,下面通过一个对比表格来展示它们的特性:

特性CSVJSONTXT
数据结构表格形式层次化结构纯文本
可读性中等
机器解析容易非常容易需要自定义解析
数据复杂度简单到中等
文件大小较小中等最小
适用场景表格数据、数据分析配置数据、API响应日志、配置文件

综合实战:数据格式转换

在实际项目中,经常需要在不同格式之间进行数据转换。下面展示一个综合示例:

import csv
import json
from datetime import datetime

def csv_to_json(csv_filename, json_filename):
    """将CSV文件转换为JSON格式"""
    data = {"records": [], "metadata": {}}
    
    with open(csv_filename, 'r', encoding='utf-8') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            data["records"].append(row)
    
    data["metadata"] = {
        "conversion_date": datetime.now().isoformat(),
        "source_format": "CSV",
        "target_format": "JSON",
        "record_count": len(data["records"])
    }
    
    with open(json_filename, 'w', encoding='utf-8') as jsonfile:
        json.dump(data, jsonfile, ensure_ascii=False, indent=2)
    
    return data

def json_to_txt(json_filename, txt_filename, template=None):
    """将JSON文件转换为自定义文本格式"""
    with open(json_filename, 'r', encoding='utf-8') as jsonfile:
        data = json.load(jsonfile)
    
    if template is None:
        template = "记录 {index}: {data}\n"
    
    with open(txt_filename, 'w', encoding='utf-8') as txtfile:
        txtfile.write(f"数据转换报告\n")
        txtfile.write("=" * 40 + "\n")
        txtfile.write(f"转换时间: {data['metadata']['conversion_date']}\n")
        txtfile.write(f"记录数量: {data['metadata']['record_count']}\n")
        txtfile.write("=" * 40 + "\n\n")
        
        for i, record in enumerate(data['records'], 1):
            line = template.format(index=i, data=json.dumps(record, ensure_ascii=False))
            txtfile.write(line)

# 使用示例
csv_to_json('employees.csv', 'employees.json')
json_to_txt('employees.json', 'employees_report.txt')

错误处理与最佳实践

在处理文件操作时,良好的错误处理机制至关重要:

import json
import csv
import os

def safe_file_operation(operation, filename, *args, **kwargs):
    """安全的文件操作包装器"""
    try:
        return operation(filename, *args, **kwargs)
    except FileNotFoundError:
        print(f"错误: 文件 {filename} 不存在")
        return None
    except PermissionError:
        print(f"错误: 没有权限访问文件 {filename}")
        return None
    except json.JSONDecodeError as e:
        print(f"JSON解析错误: {e}")
        return None
    except Exception as e:
        print(f"未知错误: {e}")
        return None

# 安全读取JSON
def safe_json_read(filename):
    def read_op(fname):
        with open(fname, 'r', encoding='utf-8') as f:
            return json.load(f)
    return safe_file_operation(read_op, filename)

# 安全写入CSV
def safe_csv_write(filename, data, fieldnames):
    def write_op(fname):
        with open(fname, 'w', newline='', encoding='utf-8') as f:
            writer = csv.DictWriter(f, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerows(data)
        return True
    return safe_file_operation(write_op, filename)

# 使用示例
data = safe_json_read('users.json')
if data:
    print("成功读取JSON数据")

通过本文的详细讲解和代码示例,相信你已经掌握了Python中CSV、JSON和TXT文件处理的核心技能。在实际开发中,根据具体需求选择合适的文件格式,并遵循最佳实践,将大大提高代码的健壮性和可维护性。

正则表达式基础语法

正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它使用特定的语法模式来匹配、查找和操作字符串。在Python中,正则表达式通过内置的re模块提供支持,是处理文本数据的必备技能。

正则表达式基本概念

正则表达式由普通字符(如字母、数字)和特殊字符(称为元字符)组成,这些字符组合在一起形成一个搜索模式。理解正则表达式的核心在于掌握这些元字符的含义和使用方法。

常用元字符及其功能
元字符描述示例匹配结果
.匹配任意单个字符(除换行符)h.llohello, hallo, hxllo
^匹配字符串的开始^HelloHello World
$匹配字符串的结束World$Hello World
*匹配前一个字符0次或多次he*llohllo, hello, heeeeello
+匹配前一个字符1次或多次he+llohello, heeeeello
?匹配前一个字符0次或1次he?llohllo, hello
{n}匹配前一个字符恰好n次he{2}llohello
{n,}匹配前一个字符至少n次he{2,}llohello, heeeeello
{n,m}匹配前一个字符n到m次he{1,3}llohello, heello, heeello

字符类与字符集

字符类使用方括号[]定义,用于匹配方括号内的任意一个字符。

import re

# 匹配元音字母
pattern = r"[aeiou]"
text = "Hello World"
result = re.findall(pattern, text)
print(result)  # ['e', 'o', 'o']

# 匹配数字
pattern = r"[0-9]"
text = "Year 2024"
result = re.findall(pattern, text)
print(result)  # ['2', '0', '2', '4']

# 排除特定字符
pattern = r"[^0-9]"  # 匹配非数字字符
text = "Year 2024"
result = re.findall(pattern, text)
print(result)  # ['Y', 'e', 'a', 'r', ' ']

预定义字符类

Python提供了一些预定义的字符类,简化了常见模式的编写:

字符类等价形式描述
\d[0-9]匹配任意数字
\D[^0-9]匹配任意非数字字符
\w[a-zA-Z0-9_]匹配字母、数字、下划线
\W[^a-zA-Z0-9_]匹配非字母、数字、下划线字符
\s[ \t\n\r\f\v]匹配空白字符
\S[^ \t\n\r\f\v]匹配非空白字符
import re

# 使用预定义字符类
text = "Contact: email@example.com, Phone: 123-456-7890"

# 匹配所有数字
digits = re.findall(r"\d", text)
print("Digits:", digits)  # ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']

# 匹配所有单词字符
words = re.findall(r"\w+", text)
print("Words:", words)  # ['Contact', 'email', 'example', 'com', 'Phone', '123', '456', '7890']

# 匹配空白字符
spaces = re.findall(r"\s", text)
print("Spaces:", spaces)  # [' ', ':', ' ', ',', ' ', ':', ' ']

分组与捕获

圆括号()用于创建捕获组,可以对匹配的内容进行分组和提取:

import re

# 简单的分组示例
text = "John Doe, Jane Smith, Bob Johnson"

# 匹配姓名(名和姓)
pattern = r"(\w+)\s(\w+)"
matches = re.findall(pattern, text)
print("Name matches:", matches)  # [('John', 'Doe'), ('Jane', 'Smith'), ('Bob', 'Johnson')]

# 使用分组提取特定信息
email_text = "Emails: john@example.com, jane.doe@company.org"
email_pattern = r"(\w+[\.]?\w+)@(\w+)\.(\w+)"
emails = re.findall(email_pattern, email_text)
print("Email components:", emails)  # [('john', 'example', 'com'), ('jane.doe', 'company', 'org')]

选择与或操作

竖线|用于表示"或"操作,可以匹配多个模式中的任意一个:

import re

text = "I like cats and dogs, but I prefer cats."

# 匹配"cats"或"dogs"
pattern = r"cats|dogs"
matches = re.findall(pattern, text)
print("Animals:", matches)  # ['cats', 'dogs', 'cats']

# 结合分组使用
pattern = r"(like|prefer)\s(\w+)"
matches = re.findall(pattern, text)
print("Preferences:", matches)  # [('like', 'cats'), ('prefer', 'cats')]

实际应用示例

让我们通过一些实际的例子来巩固正则表达式的基础语法:

import re

# 示例1:验证电话号码格式
def validate_phone_number(phone):
    pattern = r"^\(\d{3}\) \d{3}-\d{4}$"
    return bool(re.match(pattern, phone))

print(validate_phone_number("(123) 456-7890"))  # True
print(validate_phone_number("123-456-7890"))    # False

# 示例2:提取日期信息
text = "Meeting on 2024-12-25 and 2025-01-01"
pattern = r"(\d{4})-(\d{2})-(\d{2})"
dates = re.findall(pattern, text)
print("Dates:", dates)  # [('2024', '12', '25'), ('2025', '01', '01')]

# 示例3:简单的HTML标签匹配
html = "<div>Hello</div><p>World</p>"
pattern = r"<(\w+)>(.*?)</\1>"
tags = re.findall(pattern, html)
print("HTML tags:", tags)  # [('div', 'Hello'), ('p', 'World')]

正则表达式流程图

下面通过流程图展示正则表达式的匹配过程:

mermaid

常见模式总结表

模式类型语法示例描述
精确匹配texthello匹配精确文本
字符类[abc][aeiou]匹配括号内任意字符
范围匹配[a-z][0-9]匹配指定范围内的字符
排除匹配[^abc][^0-9]匹配不在括号内的字符
任意字符.h.llo匹配任意单个字符
开始匹配^^Hello匹配字符串开始
结束匹配$end$匹配字符串结束
零次或多次*he*llo匹配前一个字符0次或多次
一次或多次+he+llo匹配前一个字符1次或多次
零次或一次?he?llo匹配前一个字符0次或1次
精确次数{n}he{2}llo匹配前一个字符恰好n次

掌握这些基础语法是使用正则表达式的关键。在实际应用中,这些基本构建块可以组合成复杂的模式来解决各种文本处理问题。记住,正则表达式是一门需要实践的语言,多练习才能熟练掌握。

模式匹配与文本搜索

正则表达式是Python中处理文本模式的强大工具,它能够帮助我们进行复杂的模式匹配和文本搜索操作。在Hello-Python项目的Intermediate目录中,07_regular_expressions.py文件详细展示了正则表达式的各种应用场景。

正则表达式基础操作

Python通过re模块提供正则表达式功能,包含多种核心方法用于模式匹配:

match方法 - 从字符串开头匹配
import re

my_string = "Esta es la lección número 7: Lección llamada Expresiones Regulares"
match = re.match("Esta es la lección", my_string, re.I)
print(match)  # 返回匹配对象
start, end = match.span()
print(my_string[start:end])  # 输出匹配的文本

match()方法从字符串开头进行匹配,如果开头不匹配则返回Nonere.I参数表示忽略大小写。

search方法 - 搜索整个字符串
search = re.search("lección", my_string, re.I)
print(search)
start, end = search.span()
print(my_string[start:end])

match()不同,search()会在整个字符串中搜索匹配项,找到第一个匹配即返回。

findall方法 - 查找所有匹配项
findall = re.findall("lección", my_string, re.I)
print(findall)  # 返回所有匹配的字符串列表

findall()返回所有非重叠匹配的字符串列表,非常适合批量提取信息。

字符串处理操作

正则表达式还提供了强大的字符串处理功能:

split方法 - 基于模式分割字符串
print(re.split(":", my_string))
# 输出: ['Esta es la lección número 7', ' Lección llamada Expresiones Regulares']

split()方法使用正则表达式模式作为分隔符来分割字符串。

sub方法 - 替换匹配文本
print(re.sub("[l|L]ección", "LECCIÓN", my_string))
# 输出: Esta es la LECCIÓN número 7: LECCIÓN llamada Expresiones Regulares

print(re.sub("Expresiones Regulares", "RegEx", my_string))
# 输出: Esta es la lección número 7: Lección llamada RegEx

sub()方法用于替换匹配的模式,支持复杂的替换逻辑。

正则表达式模式语法

正则表达式的强大之处在于其丰富的模式语法:

mermaid

常用模式示例
# 字符类模式
pattern = r"[lL]ección"  # 匹配"lección"或"Lección"
print(re.findall(pattern, my_string))

pattern = r"[lL]ección|Expresiones"  # 匹配"lección"或"Expresiones"
print(re.findall(pattern, my_string))

# 数字匹配
pattern = r"[0-9]"  # 匹配单个数字
print(re.findall(pattern, my_string))

pattern = r"\d"  # 等价于[0-9]
print(re.findall(pattern, my_string))

pattern = r"\D"  # 匹配非数字字符
print(re.findall(pattern, my_string))

# 贪婪匹配
pattern = r"[l].*"  # 匹配以'l'开头,后面跟着任意字符
print(re.findall(pattern, my_string))

电子邮件验证实战

正则表达式在数据验证方面特别有用,以下是一个电子邮件验证的完整示例:

email = "mouredev@mouredev.com"
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z-.]+$"

# 使用不同方法验证
print(re.match(pattern, email))    # 从开头匹配
print(re.search(pattern, email))   # 搜索整个字符串
print(re.findall(pattern, email))  # 查找所有匹配

# 测试不同域名格式
email = "mouredev@mouredev.com.mx"
print(re.findall(pattern, email))

这个模式分解如下:

模式部分描述示例匹配
^[a-zA-Z0-9_.+-]+用户名部分,包含字母、数字、下划线、点、加号和减号mouredev
@必须的@符号@
[a-zA-Z0-9-]+域名部分mouredev
\.必须的点.
[a-zA-Z-.]+$顶级域名comcom.mx

实际应用场景

正则表达式在文本处理中有广泛的应用:

  1. 数据提取:从日志文件、文档或网页中提取特定信息
  2. 数据验证:验证用户输入的格式(邮箱、电话、URL等)
  3. 文本清洗:移除或替换不需要的字符或格式
  4. 字符串分割:基于复杂模式分割文本
  5. 搜索替换:批量修改文本内容
# 实际应用:提取文本中的所有数字
text = "订单号: 12345, 金额: $99.99, 数量: 3件"
numbers = re.findall(r'\d+\.?\d*', text)
print(numbers)  # 输出: ['12345', '99.99', '3']

# 实际应用:验证电话号码格式
phone_pattern = r'^(\+?\d{1,3}[-.\s]?)?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$'
valid_phones = ["+1-234-567-8901", "1234567890", "(123) 456-7890"]
for phone in valid_phones:
    if re.match(phone_pattern, phone):
        print(f"{phone} 是有效的电话号码")

通过掌握正则表达式的模式匹配和文本搜索技术,你能够高效地处理各种文本处理任务,大大提升编程效率。

总结

本文系统性地讲解了Python文件操作与正则表达式的完整知识体系。文件操作部分详细介绍了各种读写模式的特点和适用场景,以及CSV、JSON、TXT三种格式的处理方法;正则表达式部分则从基础语法到高级应用,涵盖了模式匹配、文本搜索、数据验证等实用技能。通过本文的学习,读者能够掌握高效处理文本数据的综合能力,为实际项目开发奠定坚实基础。建议读者结合实际需求多加练习,才能真正熟练掌握这些强大的文本处理工具。

【免费下载链接】Hello-Python mouredev/Hello-Python: 是一个用于学习 Python 编程的简单示例项目,包含多个练习题和参考答案,适合用于 Python 编程入门学习。 【免费下载链接】Hello-Python 项目地址: https://gitcode.com/GitHub_Trending/he/Hello-Python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值