如何用正则表达式验证文件行的首尾各两个字符?
解决正则验证行首尾字符的问题
我来帮你梳理下代码里的问题,一步步修正:
1. 正则表达式语法错误
你的两个正则都存在语法问题:
- 开头正则
r"^[.B]?{2}":?表示匹配0或1次,后面跟{2}属于无效语法。如果是强制要求前两个字符只能是.或B,应该写成r"^[.B]{2}";如果是允许0-2个符合规则的字符(最多两个、最少0个),则用r"^[.B]{0,2}"。 - 结尾正则
r"[);]?{2}$":同样的语法错误,要强制后两个字符是)或;,改成r"[);]{2}$";允许0-2个的话用r"[);]{0,2}$"。
2. 代码逻辑与语法错误
- 逻辑运算符误用:Python里逻辑与是
and,不是&(&是位运算符),条件判断应该写成if regexC.search(line) is not None and regexC1.search(line) is not None: - 括号位置错误:你写的
regexC1.search(line is not None)完全不符合逻辑,应该是先把line传入search方法,再判断结果是否非空,即regexC1.search(line) is not None。 - 文件打开模式错误:用
"w"模式每次循环都会清空文件,最终只会保留最后一行符合条件的内容,应该改用"a"(追加模式)。另外推荐用with语句管理文件,避免资源泄漏。 - 字节串匹配问题:
gzip.open用"rb"模式打开时,line是字节串(bytes类型),而你的正则是字符串模式,要么把正则编译成字节模式(比如regex = rb"^[.B]{2}"),要么打开文件用文本模式"rt"(需要指定编码,比如gzip.open(path1 + filename, "rt", encoding="utf-8"))。
修正后的完整代码
import re import os import gzip # 修正正则:这里假设你需要强制前两个是 .或B,后两个是)或; regex = rb"^[.B]{2}" # 字节模式,对应rb打开的文件 regexEnd = rb"[);]{2}$" regexC = re.compile(regex) regexC1 = re.compile(regexEnd) path1 = "./your_target_path/" # 替换成你的实际路径 # 用with管理输出文件,避免忘记关闭 with open("db.txt", "ab") as output_file: for filename in os.listdir(path1): file_path = os.path.join(path1, filename) # 用os.path.join避免路径拼接的潜在问题 with gzip.open(file_path, "rb") as f: for line in f: # 同时匹配开头和结尾,用match匹配开头更精准 if regexC.match(line) and regexC1.search(line): output_file.write(line)
额外说明
如果你的文件是文本格式,更推荐用文本模式打开,这样正则可以直接用字符串:
regex = r"^[.B]{2}" regexEnd = r"[);]{2}$" # ... with gzip.open(file_path, "rt", encoding="utf-8") as f: for line in f: if regexC.match(line) and regexC1.search(line): output_file.write(line)
另外用 match 代替 search 匹配开头更准确,因为 match 是从字符串起始位置匹配,而 search 会遍历整个字符串查找匹配项。
内容的提问来源于stack exchange,提问作者pierreafranck
相关产品推荐
相关产品推荐

