跳过正文
  1. Posts/

正则表达式练习

·1670 字·4 分钟· loading · loading · · ·
ICE345
作者
ICE345
CS Student | System | Linux | OCaml

以下是一些精心设计的正则表达式练习,结合了 Python 编程文件操作,帮助你熟悉正则表达式在不同场景中的实际应用。


练习一:基本字符匹配
#

目标:掌握正则表达式的基础功能。

  1. 任务

    • 提取字符串中的所有电话号码(格式如:123-456-78901234567890)。
    • 提取所有以 “test” 开头的单词。
  2. 代码模板

    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)

练习二:处理文件名
#

目标:熟悉正则表达式操作文件名。

  1. 任务

    • 在指定文件夹中,找到所有以 test_ 开头的文件。
    • 将这些文件重命名为去掉 test_ 的新名字。
  2. 代码模板

    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}")

练习三:文本清洗
#

目标:使用正则表达式清洗文本数据。

  1. 任务

    • 移除文本中的所有 HTML 标签。
    • 替换所有连续的空白字符为单个空格。
  2. 代码模板

    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)

练习四:验证用户输入
#

目标:使用正则表达式对用户输入进行格式验证。

  1. 任务

    • 验证一个输入是否是有效的电子邮件地址。
    • 验证一个输入是否是有效的 URL。
  2. 代码模板

    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 地址。

  1. 任务

    • 打开一个日志文件。
    • 提取其中的所有 IPv4 地址。
  2. 代码模板

    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)

练习六:复杂文件名处理
#

目标:掌握文件名匹配和高级正则表达式。

  1. 任务

    • 查找文件夹中的所有符合以下模式的文件名:课程编号_章节名_说明_时间戳.ext
    • 从文件名中提取 课程编号章节名,生成新的文件名格式:课程编号-章节名.ext
  2. 代码模板

    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}")

练习七:动态生成正则表达式
#

目标:掌握在代码中动态构造正则表达式。

  1. 任务

    • 根据用户输入的关键词列表,生成一个动态正则表达式,用来查找文本中包含任意关键词的句子。
  2. 代码模板

    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 文件操作 中使用正则表达式。完成每个任务后,试着改动规则或扩展功能,进一步加深理解!

相关文章