正则正向预查提取文本时,如何忽略匹配前第一个换行符?
解决正则提取“METROS”前文本的换行问题
嘿,我来帮你搞定这个正则匹配的问题!先理清楚你的核心需求:从给定文本里提取METROS之前的内容,要跳过开头的第一个换行符,同时把中间的第二个换行去掉,合并成连续的目标文本。
你的当前正则问题分析
你用的([^\\n{1}]\n.*)(?=METROS)存在逻辑偏差:[^\\n{1}]是一个字符集合,它匹配的是不包含\、n、{、1、}的单个字符,所以会恰好命中文本里的Y,再加上后面的换行和NUEVE,最终得到Y NUEVE,完全不符合你的预期。
正确解决方案
这里有两种简单靠谱的实现方式,都能得到你想要的MIDE UNA SUPERFICIE DE CINCUENTA Y NUEVE:
方法一:匹配后处理换行符
先精准匹配第一个换行后到METROS前的内容,再去掉中间的换行符:
import re original_text = "DATOS DEL LUGAR \n MIDE UNA SUPERFICIE DE CINCUENTA Y \n NUEVE METROS CUADRADOS" # 正则锁定第一个换行后到METROS前的内容 match_result = re.search(r'(?<=\n)(.*?)(?=\s*METROS)', original_text, re.DOTALL) if match_result: # 移除中间换行并清理多余空格 extracted_text = match_result.group(1).replace('\n', '').strip() print(extracted_text)
正则部分拆解:
(?<=\n):正向断言,确保匹配起点在第一个换行符之后.*?:非贪婪匹配任意字符(re.DOTALL让.能覆盖换行符)(?=\s*METROS):正向断言,确保匹配终点在METROS之前(允许METROS前带空格)
方法二:正则替换一步到位
直接通过正则替换完成提取+换行合并:
import re original_text = "DATOS DEL LUGAR \n MIDE UNA SUPERFICIE DE CINCUENTA Y \n NUEVE METROS CUADRADOS" extracted_text = re.sub( r'^.*?\n(.*?)\s*METROS.*$', lambda m: m.group(1).replace('\n', ''), original_text ).strip() print(extracted_text)
这个写法用^.*?\n跳过开头内容和第一个换行,捕获METROS前的所有内容,再通过lambda函数移除捕获内容里的换行符。
验证结果
两种方法最终都会输出:MIDE UNA SUPERFICIE DE CINCUENTA Y NUEVE
内容的提问来源于stack exchange,提问作者Pedro LC
相关产品推荐
相关产品推荐

