简介
本全面教程将探索在 Python 中使用正则表达式进行文本解析的强大功能。无论你是初学者还是有经验的程序员,都将学习到使用正则表达式进行模式匹配、数据提取和文本操作的基本技术。通过掌握这些技能,你将能够更高效、精确地处理和分析文本数据。
本全面教程将探索在 Python 中使用正则表达式进行文本解析的强大功能。无论你是初学者还是有经验的程序员,都将学习到使用正则表达式进行模式匹配、数据提取和文本操作的基本技术。通过掌握这些技能,你将能够更高效、精确地处理和分析文本数据。
正则表达式(Regex)是一个强大的字符序列,用于定义搜索模式。它为在编程中匹配字符串、解析文本以及执行复杂的文本操作提供了一种简洁而灵活的方式。
字面字符在文本中完全匹配自身。
import re
text = "Hello, LabEx!"
pattern = "Hello"
result = re.search(pattern, text)
print(result.group()) ## 输出:Hello
| 元字符 | 描述 | 示例 |
|---|---|---|
| . | 匹配任意单个字符 | a.c 匹配 "abc", "adc" |
| ^ | 匹配字符串的开头 | ^Hello 匹配 "Hello world" |
| $ | 匹配字符串的结尾 | world$ 匹配 "Hello world" |
| * | 匹配零个或多个重复项 | ab*c 匹配 "ac", "abc", "abbc" |
| + | 匹配一个或多个重复项 | ab+c 匹配 "abc", "abbc" |
| ? | 匹配零个或一个重复项 | colou?r 匹配 "color", "colour" |
\d:匹配任意数字\w:匹配任意单词字符\s:匹配任意空白字符import re
text = "LabEx 2023 Tutorial"
digit_pattern = r'\d+'
result = re.findall(digit_pattern, text)
print(result) ## 输出:['2023']
量词指定一个字符或组应该出现的次数:
{n}:恰好 n 次{n,}:n 次或更多次{n,m}:n 到 m 次之间Python 的 re 模块提供了全面的正则表达式支持:
import re
## 匹配电子邮件模式
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
email = "user@labex.io"
if re.match(email_pattern, email):
print("有效的电子邮件")
r'')import re
text = "Welcome to LabEx Programming"
## search() 在字符串中的任何位置查找模式
search_result = re.search(r'LabEx', text)
print(search_result.group()) ## 输出:LabEx
## match() 仅在字符串开头查找模式
match_result = re.match(r'Welcome', text)
print(match_result.group()) ## 输出:Welcome
text = "Python 3.8, Python 3.9, Python 3.10"
## findall() 返回所有匹配的子字符串
versions = re.findall(r'Python \d+\.\d+', text)
print(versions) ## 输出:['Python 3.8', 'Python 3.9', 'Python 3.10']
## finditer() 返回匹配对象的迭代器
for match in re.finditer(r'Python (\d+\.\d+)', text):
print(match.group(1)) ## 输出:3.8, 3.9, 3.10
log_entry = "2023-06-15 ERROR: Database connection failed"
pattern = r'(\d{4}-\d{2}-\d{2}) (\w+): (.+)'
match = re.match(pattern, log_entry)
if match:
date = match.group(1)
level = match.group(2)
message = match.group(3)
print(f"日期: {date}, 级别: {level}, 消息: {message}")
| 技术 | 语法 | 描述 |
|---|---|---|
| 正前瞻 | (?=...) |
如果后面跟着模式则匹配 |
| 负前瞻 | (?!...) |
如果后面不跟着模式则匹配 |
| 正后顾 | (?<=...) |
如果前面跟着模式则匹配 |
| 负后顾 | (?<!...) |
如果前面不跟着模式则匹配 |
text = "price: $50, discount: $10"
## 查找前面没有 'discount:' 的价格
prices = re.findall(r'(?<!discount: )\$\d+', text)
print(prices) ## 输出:['$50']
text = "Contact us at support@labex.io or info@labex.io"
## 替换电子邮件域名
anonymized = re.sub(r'@\w+\.\w+', '@example.com', text)
print(anonymized)
## 输出:Contact us at support@example.com or info@example.com
## 使用 subn() 计算替换次数
result, count = re.subn(r'@\w+\.\w+', '@example.com', text)
print(f"替换了 {count} 次")
(?:...)## 为提高效率编译模式
compiled_pattern = re.compile(r'\d+')
text = "Numbers: 100, 200, 300"
matches = compiled_pattern.findall(text)
import re
def validate_email(email):
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
## 示例
emails = [
'user@labex.io',
'invalid.email',
'test@domain.co'
]
for email in emails:
print(f"{email}: {validate_email(email)}")
def check_password_strength(password):
patterns = [
r'.{8,}', ## 至少8个字符
r'[A-Z]', ## 至少一个大写字母
r'[a-z]', ## 至少一个小写字母
r'\d', ## 至少一个数字
r'[!@#$%^&*]' ## 至少一个特殊字符
]
return all(re.search(pattern, password) for pattern in patterns)
passwords = ['weak', 'Strong1!', 'LabEx2023']
for pwd in passwords:
print(f"{pwd}: {check_password_strength(pwd)}")
import re
log_entries = [
'2023-06-15 14:30:45 ERROR Database connection failed',
'2023-06-15 15:45:22 INFO Server started successfully',
'2023-06-16 09:12:33 WARNING Low disk space'
]
log_pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (\w+) (.+)'
for entry in log_entries:
match = re.match(log_pattern, entry)
if match:
date, time, level, message = match.groups()
print(f"日期: {date}, 时间: {time}, 级别: {level}, 消息: {message}")
def parse_csv_like_string(data):
pattern = r'"([^"]*)"'
return re.findall(pattern, data)
csv_data = 'Name,Age,City\n"John Doe",30,"New York"\n"Jane Smith",25,"San Francisco"'
parsed_data = parse_csv_like_string(csv_data)
print(parsed_data)
def extract_urls(text):
url_pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[/\w.-]*'
return re.findall(url_pattern, text)
sample_text = """
Check out these websites:
https://www.labex.io
http://example.com/page
Invalid: not a url
"""
urls = extract_urls(sample_text)
print(urls)
def standardize_phone_number(phone):
## 移除非数字字符
digits = re.sub(r'\D', '', phone)
## 格式化为(XXX) XXX-XXXX
if len(digits) == 10:
return re.sub(r'(\d{3})(\d{3})(\d{4})', r'(\1) \2-\3', digits)
return phone
phone_numbers = [
'123-456-7890',
'(987) 654-3210',
'1234567890'
]
for number in phone_numbers:
print(f"{number} -> {standardize_phone_number(number)}")
| 技术 | 建议 |
|---|---|
| 编译 | 对重复模式使用 re.compile() |
| 特异性 | 编写精确的模式 |
| 可读性 | 使用带 re.VERBOSE 标志的详细正则表达式 |
| 错误处理 | 始终验证正则表达式匹配 |
def analyze_system_logs(log_file):
error_pattern = r'(\d{4}-\d{2}-\d{2}).*ERROR: (.+)'
critical_errors = []
with open(log_file, 'r') as file:
for line in file:
match = re.search(error_pattern, line)
if match:
date, error_message = match.groups()
critical_errors.append((date, error_message))
return critical_errors
## 假设的用法
logs = analyze_system_logs('/var/log/system.log')
通过理解正则表达式的基础知识、模式匹配技术以及在Python中的实际应用,你已经获得了一个用于文本处理的强大工具包。正则表达式提供了一种灵活且强大的方法来搜索、验证和从文本数据中提取信息,从而在各个领域实现更复杂、高效的编程解决方案。