You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从字符串末尾匹配含‘кв’的子串?正则表达式优化

问题:从地址字符串末尾提取"кв"开头的子串

原始地址字符串

address1 = 'Красноярский край, г Красноярск, ул Академика Вавилова, 2Д, кв. 311'
address2 = 'Москва г, ул Ольховская, 45 стр. 1, квартира 3'
address3 = 'Красноярский край, г Красноярск, ул Академика Вавилова, 2Д, квартира 311'

需求与问题

需要提取每个地址中从"кв"开头到结尾的子串,原正则r"кв(.*)$"会匹配字符串中第一个出现的"кв"(比如address2里"Москва"中的"ква"),导致结果不符合预期:

当前错误输出

cut_flat1 = 'кв. 311'
cut_flat2 = 'ква г, ул Ольховская, 45 стр. 1, квартира 3'
cut_flat3 = 'квартира 311'

期望输出

cut_flat1 = 'кв. 311'
cut_flat2 = 'квартира 3'
cut_flat3 = 'квартира 311'

解决方案

核心思路是匹配最后一个出现的"кв"开头的子串,通过贪婪正则实现,同时修正原代码中的变量错误:

import re

address1 = 'Красноярский край, г Красноярск, ул Академика Вавилова, 2Д, кв. 311'
address2 = 'Москва г, ул Ольховская, 45 стр. 1, квартира 3'
address3 = 'Красноярский край, г Красноярск, ул Академика Вавилова, 2Д, квартира 311'

# 贪婪匹配前面所有内容,捕获最后一个以кв开头的子串
flat_template = r".*(кв.*)$"

match1 = re.search(flat_template, address1)
match2 = re.search(flat_template, address2)
match3 = re.search(flat_template, address3)

# 提取捕获组内容,处理无匹配的情况
cut_flat1 = match1.group(1) if match1 else ""
cut_flat2 = match2.group(1) if match2 else ""
cut_flat3 = match3.group(1) if match3 else ""

print(f"cut_flat1 = '{cut_flat1}'")
print(f"cut_flat2 = '{cut_flat2}'")
print(f"cut_flat3 = '{cut_flat3}'")

代码说明

  1. 正则逻辑:.*(кв.*)$中,.*是贪婪模式,会优先匹配到最后一个"кв"之前的所有内容,(кв.*)$则捕获从这个"кв"到字符串结尾的目标子串。
  2. 变量修正:原代码中误用了未定义的addresses和flat变量,改为对应地址变量和匹配对象。
  3. 容错处理:通过if match判断是否匹配成功,避免无匹配时抛出异常。

内容的提问来源于stack exchange,提问作者AidarDzhumagulov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:05:23