用正则表达式将罗马数字转换为整数

1 投票
1 回答
2580 浏览
提问于 2025-04-17 23:51

我刚开始接触正则表达式(regex)。我看过谷歌的Python正则表达式教程Python的正则表达式教程,还查阅了一些类似的问题,比如如何把包含罗马数字的字符串转换成整数如何用正则表达式匹配有效的罗马数字,但我还是感到困惑。

我的代码:

user = str(input("Input the Roman numeral: "))
characters = "I", "V" "X", "L", "C", "D", "M"
values = 1, 5, 10, 50, 100, 500, 1000

def numerals(match):
    return str(user(match.group(0)))

s = str(input("Input the Roman numeral: "))
regex = re.compile(r'\b(?=[MDCLXVI]+\b)M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?    I{0,3})\b')
print regex.sub(numerals, s)

最后两行代码来自第一个链接。我不太明白regex = re.compiler...这部分,想知道它是否真的把用户输入的罗马数字转换成整数?提前谢谢你们!

1 个回答

1

你的代码里有一些问题。首先,你的正则表达式找到了不必要的匹配。当使用括号时,应该用不匹配的表达式 (?: 来避免找到部分匹配。比如这行

regex = re.compile(r'\b(?=[MDCLXVI]+\b)M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b')

是用来在文本中找到罗马数字的。如果你打算经常使用这个表达式(比如在一个循环里),那这样做是有用的。如果只用一次,其实可以不需要提前编译。接下来的这行代码又请求用户输入,因为函数 numerals 调用了函数 user。所以它会请求同样的用户输入两次。最后,它尝试用第二次的用户输入替换第一次的输入。

print regex.sub(numerals, s)

把罗马数字转换成十进制是个复杂的任务,可能需要一个算法。我对你的代码做了一些小改动,只是为了让它朝正确的方向走:

import re
text = input("Input the Roman numeral: ")
matches = re.findall(r'(?=\b[MDCLXVI]+\b)M{0,4}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})', text)
for match in matches:
    print('Match: {}'.format(match))

输出:

Input a phrase with some Roman numerals: I LIVE IN III PLACES
Match: I
Match: III

撰写回答