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

行首罗马数字加连字符正则匹配错误修正及疑问咨询

正则匹配行首罗马数字的问题解决

需要编写正则表达式实现以下效果:

  • 匹配行首的1-99罗马数字
  • 罗马数字后必须紧跟「半角空格 + 短横(-) 或 长横(–)」
  • 给每个匹配项前添加换行符

示例字符串:

VI - lealdade e ética;  
VII - busca da verdade real;  
VIII - livre convencimento técnico-jurídico do delegado de polícia;  
IX - controle de legalidade dos atos policiais civis;  
X - uso diferenciado da força para preservação da vida, redução do sofrimento e o inciso  
II redução de danos;  
XI – continuidade investigativa  
criminal;  
XII – atuação imparcial na condução da atividade  
investigativa e de polícia judiciária;  
XIII – política de gestão direcionada à proteção e  
à valorização dos seus  
integrantes;  
XIV – unidade de doutrina e uniformidade de  
procedimento;  
XV – autonomia, imparcialidade, tecnicidade e cientificidade investigativa, indiciatória, inquisitória, notarial e pericial; "

问题1:错误匹配单独的罗马数字(如「II redução de danos;」)

原正则问题分析

你之前使用的正则 r'^(I{1,3}|IV|V|VI{1,3}|IX|X{1,3}|XL|L -|– )' 存在两个核心问题:

  1. 分组逻辑混乱:把「L -」和「– 」当成独立匹配分支,破坏了规则的连贯性
  2. 未强制罗马数字后必须跟「空格+横杠」:单独的罗马数字(如行首的II)符合I{1,3}分支,因此会被错误匹配

修正方案

先完善1-99罗马数字的完整匹配规则,再强制罗马数字后必须紧跟「半角空格 + 短横/长横」。完整正则如下:

r'^((?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})) (?:-|–)'
  • 罗马数字部分(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3}):完整覆盖1-99的所有罗马数字组合(XC=90、XL=40、L=50、X=10、I=1等)
  • (?:-|–):强制罗马数字后必须跟半角空格,再跟短横或长横,彻底避免匹配单独的罗马数字

问题2:无法匹配后跟长横(–)的罗马数字

原正则问题分析

你使用的正则 r'^(I{1,3}|IV|V|VI{1,3}|IX|X{1,3}|XL|L) (?:-|–) ' 无法匹配长横行的核心原因是罗马数字匹配规则不全:
该正则仅覆盖了I-III、IV、V、VI-VIII、IX、X-XXX、XL、L(即1-3、4、5、6-8、9、10-30、40、50),但XI(11)、XII(12)这类11-39的罗马数字完全不在匹配范围内,自然无法匹配这些数字后跟长横的行。

另外,正则末尾多了一个空格 ',如果部分行的横杠后没有空格,也会导致匹配失败,建议去掉末尾空格,或用\s*匹配可选空格。

修正方案

使用问题1中的完整罗马数字匹配规则,同时根据实际文本调整空格逻辑。如果需要允许横杠后有可选空格,可使用:

r'^((?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})) (?:-|–)\s*'

匹配后添加换行符

如果在Python中实现替换,可使用re.sub将匹配内容替换为\n\g<0>,示例代码:

import re

text = """VI - lealdade e ética;  
VII - busca da verdade real;  
VIII - livre convencimento técnico-jurídico do delegado de polícia;  
IX - controle de legalidade dos atos policiais civis;  
X - uso diferenciado da força para preservação da vida, redução do sofrimento e o inciso  
II redução de danos;  
XI – continuidade investigativa  
criminal;  
XII – atuação imparcial na condução da atividade  
investigativa e de polícia judiciária;  
XIII – política de gestão direcionada à proteção e  
à valorização dos seus  
integrantes;  
XIV – unidade de doutrina e uniformidade de  
procedimento;  
XV – autonomia, imparcialidade, tecnicidade e cientificidade investigativa, indiciatória, inquisitória, notarial e pericial; """

pattern = r'^((?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})) (?:-|–)'
result = re.sub(pattern, r'\n\g<0>', text, flags=re.MULTILINE)
print(result)

注意要添加flags=re.MULTILINE,让^匹配每一行的行首,而非整个文本的开头。


内容的提问来源于stack exchange,提问作者pedmacedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:10:55