Python 正则表达式实战:一文搞定文本处理

在 Python 中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、搜索、替换等操作。无论是数据清洗、文本解析还是复杂的文本处理任务,正则表达式都能轻松应对。今天,就让我们一起深入学习 Python 中的正则表达式,掌握其基本用法和实战技巧。

一、正则表达式基础

(一)什么是正则表达式?

正则表达式是一种特殊的文本字符串,用于描述字符串的模式。它由一系列字符和特殊符号组成,用于匹配符合特定规则的字符串。

(二)常见正则表达式符号

  • .:匹配任意单个字符(除换行符外)
  • *:匹配前面的元素零次或多次
  • +:匹配前面的元素一次或多次
  • ?:匹配前面的元素零次或一次
  • ^:匹配字符串的开头
  • $:匹配字符串的结尾
  • [ ]:匹配方括号内的任意一个字符
  • [^ ]:匹配不在方括号内的任意一个字符
  • \d:匹配任意数字
  • \w:匹配任意字母或数字(等价于 [a-zA-Z0-9_]
  • \s:匹配任意空白字符(等价于 [ \t\n\r\f\v]

二、Python 中的正则表达式模块

Python 提供了一个内置模块 re,用于处理正则表达式。re 模块提供了丰富的函数和方法,用于执行正则表达式操作。yra2

(一)常用函数

  • re.match():从字符串的开头开始匹配正则表达式。
  • re.search():在字符串中搜索正则表达式。
  • re.findall():返回所有匹配的子串。
  • re.finditer():返回一个迭代器,每次返回一个匹配对象。
  • re.sub():替换字符串中的匹配部分。
  • re.split():根据正则表达式分割字符串。

(二)示例代码

import re

# 匹配字符串开头
pattern = r'^Hello'
text = "Hello, World!"
match = re.match(pattern, text)
if match:
    print("匹配成功:", match.group())
else:
    print("匹配失败")

# 搜索字符串
pattern = r'World'
text = "Hello, World!"
match = re.search(pattern, text)
if match:
    print("匹配成功:", match.group())
else:
    print("匹配失败")

# 查找所有匹配的子串
pattern = r'\d+'
text = "123 apples, 456 oranges, 789 bananas"
matches = re.findall(pattern, text)
print("所有匹配的子串:", matches)

# 替换字符串中的匹配部分
pattern = r'\d+'
text = "123 apples, 456 oranges, 789 bananas"
result = re.sub(pattern, 'X', text)
print("替换后的字符串:", result)

# 根据正则表达式分割字符串
pattern = r'\s+'
text = "Hello,   World!  This is a test."
result = re.split(pattern, text)
print("分割后的字符串:", result)

三、正则表达式实战技巧

(一)提取电子邮件地址

import re

text = "Contact us at support@example.com or sales@example.org."
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails = re.findall(pattern, text)
print("提取的电子邮件地址:", emails)

(二)提取电话号码

import re

text = "Call us at +1 (123) 456-7890 or +44 9876 543210."
pattern = r'\+\d{1,3} \(\d{3}\) \d{3}-\d{4}|\+\d{2} \d{4} \d{6}'
phones = re.findall(pattern, text)
print("提取的电话号码:", phones)

(三)验证密码强度

import re

def validate_password(password):
    pattern = r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$'
    if re.match(pattern, password):
        return True
    return False

password = "StrongP@ssw0rd"
if validate_password(password):
    print("密码强度合格")
else:
    print("密码强度不合格")

(四)提取 HTML 标签

import re

html_text = "<html><head><title>Test</title></head><body><p>Hello, <b>World!</b></p></body></html>"
pattern = r'<[^>]+>'
tags = re.findall(pattern, html_text)
print("提取的 HTML 标签:", tags)

四、正则表达式的性能优化

(一)预编译正则表达式

如果需要多次使用同一个正则表达式,可以使用 re.compile() 预编译正则表达式,提高性能。b班不上

import re

pattern = re.compile(r'\d+')
text = "123 apples, 456 oranges, 789 bananas"
matches = pattern.findall(text)
print("所有匹配的子串:", matches)

(二)使用非贪婪匹配

默认情况下,正则表达式是贪婪的,会尽可能多地匹配字符。使用非贪婪匹配可以减少匹配的字符数,提高性能。SkylineWebcams

import re

text = "123 apples, 456 oranges, 789 bananas"
pattern = r'\d+?'  # 非贪婪匹配
matches = re.findall(pattern, text)
print("所有匹配的子串:", matches)

(三)避免过度使用正则表达式

正则表达式虽然强大,但过度使用会降低代码的可读性和性能。在可能的情况下,尽量使用简单的字符串操作方法。ddyx

五、总结

通过本文的介绍,你已经全面掌握了 Python 中的正则表达式,从基础概念到实战技巧。以下是关键点总结:

  • 正则表达式基础:了解正则表达式的常见符号和规则。
  • 常用函数re.match()re.search()re.findall()re.finditer()re.sub()re.split()
  • 实战技巧:提取电子邮件地址、电话号码,验证密码强度,提取 HTML 标签。
  • 性能优化:预编译正则表达式,使用非贪婪匹配,避免过度使用正则表达式。
posted @ 2025-09-30 21:29  宁博要学习  阅读(15)  评论(0)    收藏  举报