如何使用带占位符的正则表达式分割字符串并保留分隔符?
Python实现罗马数字分段需求
需求说明
将字符串 txt = "MCMXLIII" 分割为目标列表:['M', 'CM', 'XL', 'III']
已尝试的三种正则方法(均不符合预期)
方法一
import re txt = "MCMXLIII" print(re.sub('(CM)|(XL)', '❤️{0}❤️|❤️{1}❤️', txt).format("CM", "XL").split('❤️'))
输出:['M', 'CM', '|', 'XL', '', 'CM', '|', 'XL', 'III']
方法二
import re txt = "MCMXLIII" print(re.sub('(CM)|(XL)', '(❤️{0}❤️|❤️{1}❤️)', txt).format("CM", "XL").split('❤️'))
输出:['M(', 'CM', '|', 'XL', ')(', 'CM', '|', 'XL', ')III']
方法三
import re txt = "MCMXLIII" print(re.sub('(XL)', '❤️{0}❤️', (re.sub('(CM)', '❤️{0}❤️', txt).format("CM"))).format("XL").split('❤️'))
输出:['M', 'CM', '', 'XL', 'III']
Google Sheets实现方案
通过公式可实现正确分割:
=SPLIT( IF( REGEXMATCH(A1,"(CM)|(XL)"),REGEXREPLACE(A1, "(CM)|(XL)","❤️$0❤️")), "❤️")
该公式输出结果符合预期,将字符串拆分为['M', 'CM', 'XL', 'III']。
Python正确实现方案
方案1:使用re.findall直接匹配罗马数字单元
利用正则表达式优先匹配双字符的特殊罗马数字组合(如CM、XL),再匹配连续的单个字符序列,直接提取所有有效单元:
import re txt = "MCMXLIII" # 正则表达式:优先匹配特殊双字符组合,再匹配连续的单个罗马数字字符(最多3个,符合罗马数字规则) pattern = r'(CM|CD|XC|XL|IX|IV|M{1,3}|D|C{1,3}|L|X{1,3}|V|I{1,3})' result = re.findall(pattern, txt) print(result) # 输出: ['M', 'CM', 'XL', 'III']
方案2:模仿Google Sheets的替换-分割思路
先将目标单元用分隔符包裹,再分割并过滤空值:
import re txt = "MCMXLIII" # 用分隔符❤️包裹所有罗马数字单元 processed = re.sub(r'(CM|XL|[MDCLXVI]+)', r'❤️\1❤️', txt) # 分割后过滤空字符串 result = [item for item in processed.split('❤️') if item] print(result) # 输出: ['M', 'CM', 'XL', 'III']
内容的提问来源于stack exchange,提问作者Lod
相关产品推荐
相关产品推荐

