如何构建Regex函数提取含数字及数字加T/F的目标行?
问题描述
我有一个文本文件,内容如下:
Some text and random stuff that I don't need 2 8 2 9 T 4 9 1 10 2 10 F 7 11 T More random stuff
需要提取仅包含数字的行,以及包含数字和T或F的行。我写的代码雏形如下:
with open(file, 'r') as log_file: # opening file file = log_file while True: line = file.readlines() # if line in regex function: data.append(line) # closing file break
请问该如何实现这一需求?
实现方案
1. 确定匹配用的正则表达式
我们需要匹配两种行:
- 仅包含数字和空格的行(比如
2 8、4 9) - 包含数字、空格,结尾是T或F的行(比如
2 9 T、2 10 F)
可以用这个正则表达式:
^\d+(?:\s+\d+)*(?:\s+[TF])?$
解释一下各部分:
^:匹配行的开头\d+:匹配至少一个数字(?:\s+\d+)*:匹配零个或多个「空格+数字」的组合(?:表示非捕获组,不额外保存分组结果)(?:\s+[TF])?:可选的「空格+T/F」部分,?表示这部分可以没有$:匹配行的结尾
2. 修正并完善代码
你的代码存在几个问题:readlines()会一次性读取所有行,不需要用while True循环;缩进错误;file = log_file完全多余。下面是完整的实现代码:
import re data = [] # 替换成你的文件路径 file_path = "your_file.txt" with open(file_path, 'r') as log_file: for line in log_file: # 去掉行首尾的空白字符(包括换行、空格) stripped_line = line.strip() # 跳过空行 if not stripped_line: continue # 用正则匹配整行内容 if re.fullmatch(r'^\d+(?:\s+\d+)*(?:\s+[TF])?$', stripped_line): data.append(stripped_line) # 输出结果看看 print(data)
代码关键点说明
- 使用
re.fullmatch():确保整个行的内容完全符合正则规则,不会匹配到部分符合的情况 - 先处理空行:用
strip()后判断是否为空,避免无效的空行被误处理 - 遍历文件行:直接用
for line in log_file逐行读取,比一次性读所有行更节省内存,尤其是大文件
运行这段代码后,data列表里就会存储所有符合要求的行:['2 8', '2 9 T', '4 9', '1 10', '2 10 F', '7 11 T']
内容的提问来源于stack exchange,提问作者user16603056
相关产品推荐
相关产品推荐

