如何编写正则表达式提取UBICADO与COMUNA间的文本?
解决提取UBICADO和COMUNA之间文本的正则问题
嘿,我来帮你搞定这个正则的问题!你原来的表达式((ubicado) =?).*的问题在于它是贪婪匹配,会从ubicado开始一直抓文本到结尾,根本不会停在comuna那里。而且也没考虑大小写的问题(比如示例里的Comuna是大写开头),所以得调整一下。
推荐的正则表达式方案
这里有两种简单好用的写法,都能满足你的需求:
方案1:用捕获组(直观易懂)
(?i)ubicado(.*?)comuna
(?i):开启不区分大小写模式,不管是ubicado/UBICADO还是Comuna/comuna都能匹配。ubicado:匹配起始标记词(不区分大小写)。(.*?):非贪婪匹配任意字符(直到遇到第一个comuna就停止),括号把这部分做成捕获组,方便提取。comuna:匹配结束标记词(不区分大小写)。
使用的时候,你只需要取第一个捕获组的内容就行,比如在Python里:
import re sample_text = "departamento número veintidós del segundo piso, señalan, <strong>ubicado</strong> en calle Victoria Subercaseaux número ciento noventa y uno, <strong>Comuna</strong> de Santiago, Región Metropolitana, y demás derechos en los bienes comunes, en proporción al valor del mismo, entre los cuales se encuentra el terreno, que deslinda: NORTE, calle Valdivia; SUR, propiedad de doña Laura Zegers de" pattern = r'(?i)ubicado(.*?)comuna' match_result = re.search(pattern, sample_text) if match_result: # 用strip()去掉前后多余的空格,更整洁 extracted_text = match_result.group(1).strip() print(extracted_text)
输出结果就是:
en calle Victoria Subercaseaux número ciento noventa y uno,
方案2:用正向断言(不包含标记词,更精准)
如果你不想在匹配结果里不小心带上标记词,也可以用前后断言:
(?i)(?<=ubicado).*?(?=comuna)
(?<=ubicado):正向回顾后发断言,确保前面是ubicado,但不会把它包含在匹配结果里。(?=comuna):正向预测先行断言,确保后面是comuna,同样不会包含它。- 其他部分和方案1一样,非贪婪匹配+大小写不敏感。
关键注意点
- 一定要用非贪婪匹配
.*?:如果用.*(贪婪模式),它会直接匹配到文本最后一个comuna,而不是第一个,这大概率不是你想要的。 - 大小写不敏感:因为示例里的标记词大小写不一致,
(?i)修饰符能帮你覆盖所有大小写组合的情况。 - 处理HTML标签:如果你的文本里有像
<strong>这样的标签,也不用担心——正则会忽略它们,因为我们只匹配标记词本身,标签会被包含在中间的文本里,如果想排除标签的话,可以稍微调整正则,比如(?i)(?<=<strong>ubicado</strong>).*?(?=<strong>comuna</strong>),但这个只适用于固定标签的情况,通用场景还是用前面的方案更稳妥。
内容的提问来源于stack exchange,提问作者Alvarows
相关产品推荐
相关产品推荐

