Python正则表达式查找

Python编程快速上手——让繁琐工作自动化 第2版》

9.9.3 项目 正则表达式查找

编写一个程序,以打开文件夹中所有的.txt文件,并查找匹配用户提供的正则表达式的所有行。结果应该输出到屏幕上。

豆包AI回答
import os
import re

def find_matching_lines(folder_path, regex_pattern):
    # 编译正则表达式
    pattern = re.compile(regex_pattern)

    # 遍历指定文件夹中的所有文件
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            # 检查文件是否为 .txt 文件
            if file.endswith('.txt'):
                file_path = os.path.join(root, file)
                try:
                    # 打开文件并逐行读取
                    with open(file_path, 'r', encoding='utf-8') as f:
                        for line_number, line in enumerate(f, start=1):
                            # 检查当前行是否匹配正则表达式
                            if pattern.search(line):
                                print(f"File: {file_path}, Line {line_number}: {line.strip()}")
                except Exception as e:
                    print(f"Error reading {file_path}: {e}")

if __name__ == "__main__":
    # 获取用户输入的文件夹路径
    folder_path = input("请输入要搜索的文件夹路径: ")
    # 获取用户输入的正则表达式
    regex_pattern = input("请输入要查找的正则表达式: ")

    # 调用函数进行查找
    find_matching_lines(folder_path, regex_pattern)

运行结果:

请输入要搜索的文件夹路径: .
请输入要查找的正则表达式: ^ZOO
File: .\dictionary.txt, Line 45322: ZOO
File: .\dictionary.txt, Line 45323: ZOOLOGICAL
File: .\dictionary.txt, Line 45324: ZOOLOGICALLY
File: .\dictionary.txt, Line 45325: ZOOM
File: .\dictionary.txt, Line 45326: ZOOMS
File: .\dictionary.txt, Line 45327: ZOOS
deepseek V3模型回答:
import os
import re


def search_in_files(folder_path, regex_pattern):
    # 编译正则表达式
    regex = re.compile(regex_pattern)

    # 遍历文件夹中的所有文件
    for filename in os.listdir(folder_path):
        if filename.endswith(".txt"):
            file_path = os.path.join(folder_path, filename)
            with open(file_path, 'r', encoding='utf-8') as file:
                # 读取文件的每一行
                for line_number, line in enumerate(file, start=1):
                    if regex.search(line):
                        # 输出匹配的行
                        print(f"File: {filename}, Line {line_number}: {line.strip()}")


if __name__ == "__main__":
    # 用户输入文件夹路径和正则表达式
    folder_path = input("请输入文件夹路径: ")
    regex_pattern = input("请输入正则表达式: ")

    # 调用函数进行搜索
    search_in_files(folder_path, regex_pattern)

运行结果:

请输入文件夹路径: .
请输入正则表达式: ^ZOO
File: dictionary.txt, Line 45322: ZOO
File: dictionary.txt, Line 45323: ZOOLOGICAL
File: dictionary.txt, Line 45324: ZOOLOGICALLY
File: dictionary.txt, Line 45325: ZOOM
File: dictionary.txt, Line 45326: ZOOMS
File: dictionary.txt, Line 45327: ZOOS
总结:

本项目主要考察使用python进行文件操作,以及正则表达式的应用(逻辑比较固定,直接交给AI编写),从回答看,两个大模型给的代码都可以实现基本功能,但还是有少许差异:豆包AI的代码中有文件操作时的异常处理语句,代码更加健壮;deepseek V3给的代码在遍历文件时使用了os.listdir()方法(源码解释:Return a list containing the names of the files in the directory.返回一个包含该目录中文件名称的列表。),这块代码更加简洁。

对比os.walk()和os.listdir()方法查找txt文件
使用os.walk()

优点
递归遍历:os.walk() 会递归地遍历指定文件夹及其所有子文件夹,自动处理嵌套的文件夹结构,无需手动编写递归函数。因此,当需要查找整个文件夹树中的 .txt 文件时,使用 os.walk() 非常方便。
全面性:可以获取到每个子文件夹的路径(root)、子文件夹名称列表(dirs)和文件名称列表(files),提供了更丰富的信息,方便进行更复杂的操作。
缺点
性能开销大:由于需要递归遍历整个文件夹树,当文件夹结构复杂、文件数量较多时,会消耗较多的时间和系统资源,执行效率相对较低。
代码复杂度稍高:相比于 os.listdir(),os.walk() 的代码结构稍微复杂一些,需要理解 root、dirs 和 files 三个变量的含义和使用方法。


使用os.listdir()

优点
简单直接:代码逻辑简单,易于理解和实现。如果只需要处理指定文件夹下的文件,不涉及子文件夹,使用 os.listdir() 可以快速获取该文件夹内的所有文件和文件夹名称,然后筛选出 .txt 文件。
性能较高:由于只处理指定文件夹下的文件,不递归遍历子文件夹,所以在不需要处理子文件夹的情况下,执行速度相对较快,占用的系统资源也较少。
缺点
不支持递归:os.listdir() 只能列出指定文件夹下的直接子文件和子文件夹,无法递归遍历子文件夹中的文件。如果需要处理子文件夹中的 .txt 文件,就需要自己编写递归函数,增加了代码的复杂度。

对比总结
特性方案一 (os.walk)方案二 (os.listdir)
遍历范围当前文件夹及其所有子文件夹仅当前文件夹
代码复杂度稍复杂简单
性能较低(递归遍历)较高(单层遍历)
适用场景多层文件夹,结构复杂单层文件夹,结构简单
选择建议

如果需要递归查找整个文件夹树中的 .txt 文件,方案一更合适,虽然性能开销大一些,但可以方便地处理嵌套的文件夹结构。

如果只需要处理指定文件夹下的 .txt 文件,不涉及子文件夹,建议使用方案二,因为它简单高效。

### 如何使用Python正则表达式匹配字符串中的`EB201`模式 在Python中,可以通过`re`模块来实现正则表达式的操作。要查找特定的模式`EB201`,可以按照以下方式编写代码: #### 步骤解析 1. **指定模式字符串** 使用`r'EB201'`作为正则表达式的模式字符串。这里的`r`表示原始字符串,避免转义字符的影响[^1]。 2. **编译正则表达式对象** 可以通过`re.compile()`函数将模式字符串编译成一个正则表达式对象,这有助于提高性能,尤其是在多次重复使用同一模式的情况下[^1]。 3. **搜索模式** 利用`re.search()`方法可以在目标字符串中寻找第一个匹配项。如果没有找到任何匹配,则返回`None`;如果找到了匹配项,则可以通过`.group()`获取具体的匹配内容[^2]。 4. **完整代码示例** 以下是完整的代码示例,展示如何匹配字符串中的`EB201`模式: ```python import re # 定义正则表达式模式 pattern = r'EB201' # 编译正则表达式对象(可选) regex = re.compile(pattern) # 测试字符串 test_string = "This is a test string containing EB201 and other data." # 查找匹配项 match_result = regex.search(test_string) if match_result: print(f"Match found: {match_result.group()}") # 输出匹配的内容 else: print("No match found.") ``` 运行以上代码的结果将是: ``` Match found: EB201 ``` #### 关于贪婪与懒惰匹配 在此场景下,由于我们需要精确匹配`EB201`这一固定模式,因此无需考虑贪婪或懒惰匹配的概念。但如果涉及更复杂的模式(例如提取时间戳),可能需要用到`.*?`这样的非贪婪匹配符[^3]。 #### 常见注意事项 - 如果需要忽略大小写,可以在`re.compile()`或者`re.search()`中加入标志位`re.IGNORECASE`。 - 当目标字符串不包含所需模式时,`re.search()`会返回`None`,所以在访问其属性之前应先判断是否存在匹配结果[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值