2012-04-10 3 views
3

나는 다음과 같은 문자열이 있습니다로마 숫자를 포함하는 문자열은 해당 정수로 변환

str = "MMX Lions Television Inc" 

을 그리고 난으로 변환해야합니다 나는 로마를 변환하는 기능은 다음 한

conv_str = "2010 Lions Television Inc" 

숫자를 해당 정수로 변환합니다.

numeral_map = zip(
    (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1), 
    ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I') 
) 

def roman_to_int(n): 
    n = unicode(n).upper() 

    i = result = 0 
    for integer, numeral in numeral_map: 
     while n[i:i + len(numeral)] == numeral: 
      result += integer 
      i += len(numeral) 
    return result 

re.sub을 어떻게 사용합니까? 여기에 정확한 문자열을 얻으시겠습니까?

(참고 : 여기에 설명 된 regex 사용하여 시도 :. How do you match only valid roman numerals with a regular expression?를하지만이 작동하지 않는) 공통 기능/라이브러리를 찾을 때

+1

당신이 당신의 로마 숫자를 잡고, 다음 값을 얻기 위해 키를 사용하는 직선 업 사전을 사용하지 않는 이유가 있습니까? – Makoto

+2

@Makoto : 예, 숫자 추출 순서가 적절하기 때문입니다. '1000'은'M'이어야합니다 - 당신이 사전을 사용한다면'DD' 나'CCCCCCCCCC'가 될 수 없습니다. 적어도 십진법에서 로마식 숫자로의 변환에 대해서는 숫자의 고정 된 순서가 필요합니다. –

답변

2

re.sub() 교체 등의 기능을 받아 들일 수는, 함수가 일치 객체 인 하나의 인자를받을 것이다, 대체 문자열을 반환해야합니다. 로마 숫자 문자열을 int로 변환하는 기능이 이미 있으므로 어렵지 않을 것입니다.

s = "MMX Lions Television Inc" 
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(roman_to_int_repl, s) 
: 그것은 더 큰 문자열에서 일치하는 항목을 찾을 수 있도록

이제
def roman_to_int_repl(match): 
    return str(roman_to_int(match.group(0))) 

당신이 링크 된 질문에서 정규 표현식을 수정할 수 있습니다 :이 같은 기능을 원하는 것입니다 귀하의 경우에는

여기

문자열에 "LLC"를 대체하지 것이다 정규식의 버전입니다 :

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

Y OU는 수정 된 대체 기능을 원래 정규식을 사용할 수

def roman_to_int_repl(match): 
    exclude = set(["LLC"]) # add any other strings you don't want to replace 
    if match.group(0) in exclude: 
     return match.group(0) 
    return str(roman_to_int(match.group(0))) 
+0

감사합니다. 위대한 작품입니다. "LLC"를 무시하는're'도 어떻게 얻을 수 있을까요? – David542

+0

regex 시작 부분에 다음과 같이'(?! LLC \ b)'를 추가하십시오. 허용하지 않으려는 큰 목록이 있으면 다음과 같이 사용할 수 있습니다 :'(?! LLC | XXX | I) \ b)' –

5

는 항상 Python Package Index을 시도합니다.

이것은 list of modules related to the keyword 'roman'입니다.

예 'romanclass'에 대한 문서 인용, 변환을 구현하는 클래스가 있습니다

So a programmer can say: 

>>> import romanclass as roman 

>>> two = roman.Roman(2) 

>>> five = roman.Roman('V') 

>>> print (two+five) 

and the computer will print: 

VII 
+0

감사합니다. 위의 문제에 어떻게 적용됩니까? – David542

+0

추측 : 정규 표현식을 사용하여 문자열에서 로마 숫자를 추출한 다음 (OP에 링크 된 다른 대답에 따라)이 모듈을 사용하여 로마 숫자를 숫자로 변환하십시오. regex를 (문자열 찾기)에 잘 사용하고 로마 모듈을 사용하여 문자열을 숫자로 변환하는 것이 좋습니다. 그러면 강력한 솔루션을 얻을 수 있습니다. –

관련 문제