如何修改Python中re.findall语法以完成Word a10n kata题目?
问题分析与解决
你的代码目前只完成50%要求,核心问题出在正则表达式的匹配逻辑上:
- 正则里多余包含了
@#0-9,不符合题目中"单词由字母组成"的定义; - 用
\W+匹配非单词字符会把 apostrophe(')当成分隔符,拆分don't这类合法单词,导致错误缩写其中的纯字母部分。
修改后的正则与代码
调整正则来正确识别包含内部 apostrophe的单词,同时过滤掉无关字符,修改后的代码如下:
import re def abbreviate(s): # 匹配合法单词(字母+内部 apostrophe)或非字母字符序列 parts = re.findall(r"[A-Za-z]+(?:['’][A-Za-z]+)*|[^A-Za-z]+", s) result = [] for part in parts: # 仅对纯字母且长度>3的单词进行缩写 if part.isalpha() and len(part) > 3: result.append(f"{part[0]}{len(part)-2}{part[-1]}") else: result.append(part) return "".join(result)
正则说明
[A-Za-z]+:匹配一个或多个字母,作为单词的开头;(?:['’][A-Za-z]+)*:非捕获组,匹配零次或多次「 apostrophe+字母」组合,兼容don't、doesn't这类带 apostrophe的单词;[^A-Za-z]+:匹配所有非字母字符(连字符、空格、标点等),直接保留原格式。
效果验证
don't会被作为整体匹配,因包含非字母字符不缩写,结果为don't;elephant-rides拆分为elephant、-、rides,纯字母部分分别缩写为e6t和r3s,最终结果e6t-r3s;mother-in-law处理后为m3r-in-l2w,符合题目复合词的缩写规则。
内容的提问来源于stack exchange,提问作者Golab368
相关产品推荐
相关产品推荐

