正则表达式,用于标识行首后跟“-”的罗马数字 [duplicate]

Regex to identify roman numerals followed by " - " at the start of a line [duplicate]

提问人:pedmacedo 提问时间:11/14/2023 最后编辑:wjandreapedmacedo 更新时间:11/14/2023 访问量:78

问:

我正在尝试创建一个与罗马数字(从 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; "

使用这种模式,我可以在每个罗马数字之前插入一个换行符,后跟“-”或“-”。
问题在于,它还在“II harm reduction;”之前插入了换行符。我怎样才能纠正这种行为?
r'^(I{1,3}|IV|V|VI{1,3}|IX|X{1,3}|XL|L -|– )'

使用模式,我只能在罗马数字后跟“-”之前插入换行符。为什么?r'^(I{1,3}|IV|V|VI{1,3}|IX|X{1,3}|XL|L) (?:-|–) '

Python 正则表达式 罗马数字

评论

0赞 wjandrea 11/14/2023
连字符是红鲱鱼。正则表达式不包括 XI 等。
0赞 Barmar 11/14/2023
我认为试图只匹配有效的罗马数字可能有点矫枉过正。只需匹配即可匹配任何序列中的数字。误报的可能性不大,因为没有仅由这些字母组成的常用词(在英语中,不确定葡萄牙语)。[IVXL]+
0赞 Corralien 11/14/2023
尝试:以积极的眼光看待未来。^[IVXL]+(?=\s*\-)
0赞 Casimir et Hippolyte 11/14/2023
@Corralien:为什么把罗马数字放在前瞻之外?
0赞 Casimir et Hippolyte 11/14/2023
@Corralien:我在想:避免替换字符串中的引用。^(?=[IVXLCM]+ [-\u2010-\u2015] )

答:

0赞 ti7 11/14/2023 #1

有 99 个值,正则表达式的组合既多又复杂,而简单的列表则不容易创建和管理 - 考虑只测试是否与值行,或者以编程方式从中构建正则表达式.startswith(tuple_of_values)

mapping = {
    "I": 1,
    "II": 2,
    ...
    "XCIX": 100,
}

numerals_regex = re.compile("^(" + str("|".join(mapping.keys())) + ") (-|–) (.*)$")

for line in lines:
    match = numerals_regex.match(line.rstrip())
    if match is None:
        # opportunity to deal with line in some other way
        continue
    # line matched!