1

我刚开始玩弄正则表达式。我查看了Google 的 Python regex howtoPython 的 regex howto以及其他类似的问题,例如将包含罗马数字的字符串转换为等效整数以及如何仅将有效的罗马数字与正则表达式匹配?,但我仍然很困惑。

我的代码:

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...,想知道它是否真的将用户的罗马数字转换为整数?提前致谢

4

1 回答 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')

创建一个表达式以在文本中查找罗马数字。仅当您要经常使用此表达式时(例如在 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
于 2018-12-22T13:29:06.963 回答