Python正则匹配.doc文件日期模式仅返回首个匹配结果如何解决
问题原因及修复方案
核心问题
- 代码调用的
re.search()方法仅会返回文本中第一个符合正则规则的匹配结果,后续所有符合规则的匹配项都不会被捕获,后续判断mo.group() in line本质是仅搜索包含第一次匹配内容的行,自然无法输出其他符合规则的结果 - 原逻辑先全局匹配再逐行核对的设计冗余,可直接逐行做正则校验,避免遗漏匹配项
修复后代码
假设lines变量已经是你解析.doc文件后得到的按行拆分的文本列表,修复后代码如下:
import re # 可根据实际需要匹配的日期格式调整正则规则 date_pattern = re.compile(r'[a-zA-Z]+\s+\d{2,4}') for index, line in enumerate(lines): # 逐行校验是否存在匹配项 if date_pattern.search(line): # 取当前匹配行往前3行的起始下标,避免下标越界 start_index = max(0, index - 3) # 仅输出匹配位置之前的3行就把end_index设为index,原代码逻辑是输出前后3行,可按需调整 end_index = min(index + 3, len(lines)) print("".join(lines[start_index:end_index]))
可选优化
如果你要匹配的日期存在跨两行的情况,可通过全局匹配+位置映射的方式避免遗漏:
import re date_pattern = re.compile(r'[a-zA-Z]+\s+\d{2,4}') # 先拿到全文所有匹配项 all_matches = list(date_pattern.finditer(string)) # 预计算每行的起始字符位置,用于匹配位置转对应行号 line_pos_mapping = [0] for line in lines: line_pos_mapping.append(line_pos_mapping[-1] + len(line)) for match in all_matches: match_start = match.start() # 匹配位置对应行号 line_num = next(idx for idx, pos in enumerate(line_pos_mapping) if pos > match_start) - 1 start_index = max(0, line_num - 3) end_index = min(line_num + 3, len(lines)) print("".join(lines[start_index:end_index]))
内容的提问来源于stack exchange,提问作者DEEKSHA SHARMA
相关产品推荐
相关产品推荐

