以下是一些精心设计的正则表达式练习,结合了 Python 编程 和 文件操作,帮助你熟悉正则表达式在不同场景中的实际应用。
练习一:基本字符匹配
目标:掌握正则表达式的基础功能。
- 任务:
- 提取字符串中的所有电话号码(格式如:
123-456-7890或1234567890)。 - 提取所有以 “test” 开头的单词。
- 提取字符串中的所有电话号码(格式如:
- 代码模板:
import re text = """ 联系人1:123-456-7890 联系人2:9876543210 测试数据:test1, test2, testing """ # 匹配电话号码 phone_pattern = r'\d{3}-\d{3}-\d{4}|\d{10}' phones = re.findall(phone_pattern, text) print("电话号码列表:", phones) # 匹配以 test 开头的单词 test_pattern = r'\btest\w*\b' test_words = re.findall(test_pattern, text) print("以 test 开头的单词:", test_words)
练习二:处理文件名
目标:熟悉正则表达式操作文件名。
- 任务:
- 在指定文件夹中,找到所有以
test_开头的文件。 - 将这些文件重命名为去掉
test_的新名字。
- 在指定文件夹中,找到所有以
- 代码模板:
import os import re folder_path = r'F:\your_folder' # 替换为你的文件夹路径 # 正则匹配以 test_ 开头的文件 pattern = re.compile(r'^test_(.+)$') for root, dirs, files in os.walk(folder_path): for file in files: match = pattern.match(file) if match: new_name = match.group(1) os.rename(os.path.join(root, file), os.path.join(root, new_name)) print(f"重命名:{file} -> {new_name}")
练习三:文本清洗
目标:使用正则表达式清洗文本数据。
- 任务:
- 移除文本中的所有 HTML 标签。
- 替换所有连续的空白字符为单个空格。
- 代码模板:
import re text = """ <html> <head><title>测试页面</title></head> <body> <h1>标题</h1> <p>这是一个段落。</p> <p> 还有一些 多余的空格。</p> </body> </html> """ # 移除 HTML 标签 html_pattern = r'<[^>]+>' clean_text = re.sub(html_pattern, '', text) print("去掉 HTML 标签后的文本:\n", clean_text) # 替换连续空格为单个空格 space_pattern = r'\s+' clean_text = re.sub(space_pattern, ' ', clean_text) print("清理空格后的文本:\n", clean_text)
练习四:验证用户输入
目标:使用正则表达式对用户输入进行格式验证。
- 任务:
- 验证一个输入是否是有效的电子邮件地址。
- 验证一个输入是否是有效的 URL。
- 代码模板:
import re # 验证电子邮件 email = input("请输入一个电子邮件地址:") email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$' if re.match(email_pattern, email): print("有效的电子邮件地址") else: print("无效的电子邮件地址") # 验证 URL url = input("请输入一个 URL:") url_pattern = r'^https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/.*)?$' if re.match(url_pattern, url): print("有效的 URL") else: print("无效的 URL")
练习五:提取日志中的 IP 地址
目标:从日志文件中提取所有的 IP 地址。
- 任务:
- 打开一个日志文件。
- 提取其中的所有 IPv4 地址。
- 代码模板:
import re # 假设日志内容 log_data = """ 192.168.0.1 - - [24/Nov/2024:14:15:22] "GET /index.html HTTP/1.1" 200 10.0.0.5 - - [24/Nov/2024:14:16:00] "POST /form.html HTTP/1.1" 404 Invalid log entry 123.456.789.0 """ # 匹配 IPv4 地址 ip_pattern = r'((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)' # 使用 finditer 获取迭代器 matches = re.finditer(ip_pattern, log_data) ips = [match.group(0) for match in matches] print("提取的 IP 地址:", ips)
练习六:复杂文件名处理
目标:掌握文件名匹配和高级正则表达式。
- 任务:
- 查找文件夹中的所有符合以下模式的文件名:
课程编号_章节名_说明_时间戳.ext。 - 从文件名中提取
课程编号和章节名,生成新的文件名格式:课程编号-章节名.ext。
- 查找文件夹中的所有符合以下模式的文件名:
- 代码模板:
import os import re folder_path = r'F:\your_folder' # 替换为你的文件夹路径 # 匹配复杂文件名 pattern = re.compile(r'^(课程\d+)_(章节\d+)_.+?_(\d+)\.(.+)$') for root, dirs, files in os.walk(folder_path): for file in files: match = pattern.match(file) if match: course = match.group(1) chapter = match.group(2) ext = match.group(4) new_name = f"{course}-{chapter}.{ext}" os.rename(os.path.join(root, file), os.path.join(root, new_name)) print(f"重命名:{file} -> {new_name}")
练习七:动态生成正则表达式
目标:掌握在代码中动态构造正则表达式。
- 任务:
- 根据用户输入的关键词列表,生成一个动态正则表达式,用来查找文本中包含任意关键词的句子。
- 代码模板:
import re text = """ 今天我学习了正则表达式,它非常有用。 Python 编程语言让我感觉很强大。 我还想学习更多关于人工智能的知识。 """ # 用户输入关键词 keywords = input("请输入关键词,用空格分隔:").split() keyword_pattern = '|'.join(map(re.escape, keywords)) # 动态构造正则表达式 sentence_pattern = fr'\b.*?({keyword_pattern}).*?\.' sentences = re.findall(sentence_pattern, text, re.IGNORECASE) print("匹配的句子:", sentences)
通过以上练习,你可以逐步熟悉 正则表达式的匹配规则,以及如何在 Python 文件操作 中使用正则表达式。完成每个任务后,试着改动规则或扩展功能,进一步加深理解!