如何从字符串末尾匹配含‘кв’的子串?正则表达式优化
问题:从地址字符串末尾提取"кв"开头的子串
原始地址字符串
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}'")
代码说明
- 正则逻辑:
.*(кв.*)$中,.*是贪婪模式,会优先匹配到最后一个"кв"之前的所有内容,(кв.*)$则捕获从这个"кв"到字符串结尾的目标子串。 - 变量修正:原代码中误用了未定义的
addresses和flat变量,改为对应地址变量和匹配对象。 - 容错处理:通过
if match判断是否匹配成功,避免无匹配时抛出异常。
内容的提问来源于stack exchange,提问作者AidarDzhumagulov
相关产品推荐
相关产品推荐

