需求:使用正则表达式提取符合特定规则的建筑名称
提取符合规则的建筑名称正则表达式方案
需求说明
需从文本列表中提取建筑名称,规则如下:
- 建筑名称始终全大写,前缀为
Building: - 前缀后紧跟以下任意内容时,提取前缀后的全大写建筑名称:
- (a) 数字;(b) 全大写的
UNIT单词;(c) 任意大小写混合单词
- (a) 数字;(b) 全大写的
- 非
Building:开头的行返回空值
现有正则问题
当前使用的正则^.*Building:\s([A-Z+\s*]*).*存在两个核心问题:
- 贪婪匹配导致将后续的全大写
UNIT也包含进结果(第三个示例) - 仅匹配大写字母和空格,遇到小写字母时提前终止匹配(第四个示例只提取到
BUILDING ONE F)
修正后的正则表达式
.*Building:\s+([A-Z\s]+?)(?=\s+(?:\d|UNIT|[A-Za-z]+))
正则解析
.*Building:\s+:匹配任意前置文本,精准定位到Building:及后续的一个或多个空格([A-Z\s]+?):非贪婪匹配全大写字母与空格组合,确保只提取目标建筑名称(?=\s+(?:\d|UNIT|[A-Za-z]+)):正向预查,用于终止匹配的条件——当后续出现空格+数字/全大写UNIT/任意大小写混合单词时,停止提取
验证结果
将正则应用到示例文本,提取结果如下:
Building: BUILDING ONE 15 [...]→BUILDING ONEOptional preceding text Building: BUILDING ONE 15 [...]→BUILDING ONEBuilding: BUILDING ONE UNIT 15 [...]→BUILDING ONEBuilding: BUILDING ONE Floor 2 [...]→BUILDING ONEGrounds: OPEN SPACE WEST Section 3 [...]→ 无匹配(返回空值)
Python使用提示
在Python的re模块中,可通过re.search()方法匹配,提取group(1)的值;若未匹配到结果,则返回空:
import re pattern = r'.*Building:\s+([A-Z\s]+?)(?=\s+(?:\d|UNIT|[A-Za-z]+))' text = "Your target text here" match = re.search(pattern, text) result = match.group(1).strip() if match else ""
内容的提问来源于stack exchange,提问作者MWeber
相关产品推荐
相关产品推荐

