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

如何使用带占位符的正则表达式分割字符串并保留分隔符?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:04:53