Python:如何优雅实现按规则向字母序列插入字符'1'?
优雅解决字符串插入'1'的问题
嘿,我来帮你搞定这个字符串处理需求!先再明确下核心规则,避免理解偏差:
- 成员字符:
A、B、C、D,非成员:剩余所有大写字母 - 规则1:找到第一个后面跟着至少2个非成员字符的成员字符,在它后方插入
1;如果字符串全是成员字符,在末尾插入1 - 规则2:每个字符串最多插入一个
1,找到第一个符合条件的位置就停止
先聊聊你初始代码里的小问题
non_members定义错误,应该是排除A-D的其他字母,不是包含所有字母- 循环逻辑搞反了:应该遍历每个待处理的字符串,而非遍历成员字符
- Python字符串是不可变类型,不能直接用
insert方法,得用切片拼接或字符串替换实现修改
方案一:正则表达式(最简洁优雅)
正则天生适配这种模式匹配场景,我们可以用匹配规则定位第一个符合要求的位置,再通过count=1确保只修改一次(完美契合规则2)。
import re # 用集合存储,判断字符类型的效率更高 members = {'A', 'B', 'C', 'D'} non_members = set(chr(ord('A') + i) for i in range(26)) - members # 正则模式:捕获一个成员字符,后面跟着至少2个非成员字符 pattern = re.compile(r'([ABCD])([E-Z]{2,})') test_strings = ['AQFG', 'CCPFAKXZ', 'BDDCCA', 'HBODCSL', 'ABFCC', 'ACKTBB'] result = [] for s in test_strings: # 只替换第一个匹配的位置 modified = pattern.sub(r'\11\2', s, count=1) # 补充处理全成员字符串的特殊情况 if modified == s and all(c in members for c in s): modified += '1' result.append(modified) # 输出验证 for original, res in zip(test_strings, result): print(f"{original} ---> {res}")
方案二:遍历字符串(更直观易调试)
如果你不想用正则,也可以通过遍历每个字符的位置,逐个检查条件,找到第一个符合要求的位置就插入1并停止。
members = {'A', 'B', 'C', 'D'} non_members = set(chr(ord('A') + i) for i in range(26)) - members test_strings = ['AQFG', 'CCPFAKXZ', 'BDDCCA', 'HBODCSL', 'ABFCC', 'ACKTBB'] result = [] for s in test_strings: modified = list(s) # 转列表方便插入操作 inserted = False # 遍历到倒数第三个字符(需要后面至少两个字符做判断) for idx in range(len(s) - 2): if modified[idx] in members: # 检查后续两个字符是否都是非成员 if modified[idx+1] in non_members and modified[idx+2] in non_members: modified.insert(idx+1, '1') inserted = True break # 没找到符合规则1的位置,检查是否全是成员字符 if not inserted and all(c in members for c in s): modified.append('1') result.append(''.join(modified)) # 输出验证 for original, res in zip(test_strings, result): print(f"{original} ---> {res}")
两种方案运行后都会得到和你示例完全一致的结果:
AQFG ---> A1QFG CCPFAKXZ ---> CC1PFAKXZ BDDCCA ---> BDDCCA1 HBODCSL ---> HBODC1SL ABFCC ---> ABFCC ACKTBB ---> AC1KTBB
内容的提问来源于stack exchange,提问作者twhale
相关产品推荐
相关产品推荐

