正则表达式练习
以下是一些精心设计的正则表达式练习,结合了 Python 编程 和 文件操作,帮助你熟悉正则表达式在不同场景中的实际应用。
练习一:基本字符匹配
目标:掌握正则表达式的基础功能。
- 任务:
- 提取字符串中的所有电话号码(格式如:
123-456-7890
或1234567890
)。 - 提取所有以 "test" 开头的单词。
- 提取字符串中的所有电话号码(格式如:
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import 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_
的新名字。
- 在指定文件夹中,找到所有以
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import 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 标签。
- 替换所有连续的空白字符为单个空格。
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import 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。
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import 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 地址。
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import 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
。
- 查找文件夹中的所有符合以下模式的文件名:
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import 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}")
练习七:动态生成正则表达式
目标:掌握在代码中动态构造正则表达式。
- 任务:
- 根据用户输入的关键词列表,生成一个动态正则表达式,用来查找文本中包含任意关键词的句子。
- 代码模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import 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 文件操作 中使用正则表达式。完成每个任务后,试着改动规则或扩展功能,进一步加深理解!
正则表达式练习
http://example.com/2025/02/04/正则表达式练习/