使用正则表达式将罗马数字更改为整数

时间:2014-03-25 16:21:09

标签: python regex string-conversion roman-numerals

我刚开始玩正则表达式。我查看了Google's Python regex howtoPython's regex howto以及其他类似问题,例如Convert a string containing a roman numeral to integer equivalentHow do you match only valid roman numerals with a regular expression?,但我仍感到困惑。

我的代码:

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 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题。首先,您的正则表达式正在寻找不必要的匹配项。使用括号时,请使用非匹配表达式(?:,以避免找到部分匹配项。线

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')

创建一个表达式以在文本内查找罗马数字。仅当您要频繁使用此表达式时才有用(例如在for循环中)。如果要使用一次,则无需在使用前进行编译。下一行再次请求用户输入,因为函数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