我刚开始玩正则表达式。我查看了Google's Python regex howto和Python's regex howto以及其他类似问题,例如Convert a string containing a roman numeral to integer equivalent和How 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...
并且想知道它是否真的将用户的罗马数字转换为整数?
提前致谢
答案 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