行首罗马数字加连字符正则匹配错误修正及疑问咨询
正则匹配行首罗马数字的问题解决
需要编写正则表达式实现以下效果:
- 匹配行首的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 -|– )' 存在两个核心问题:
- 分组逻辑混乱:把「L -」和「– 」当成独立匹配分支,破坏了规则的连贯性
- 未强制罗马数字后必须跟「空格+横杠」:单独的罗马数字(如行首的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
相关产品推荐
相关产品推荐

