2012-04-10 18 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'はできません。少なくとも10進数からローマ数字への変換では、数字の固定された順序が必要です。 –

答えて

2

re.sub()は、代替としての機能を受け入れることができ、機能は、Matchオブジェクトである単一の引数を受け取ります置換文字列を返す必要があります。あなたはすでにローマ数字の文字列を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"を無視する "再"を得るでしょうか? – David542

+0

正規表現の冒頭に次の '(?!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

推測してみましょう:文字列からregexを使ってローマ数字を抽出します(あなたがOPでリンクした他の答えに応じて)。そして、このモジュールを使ってローマ数字を数字に変換します。正規表現を使って(文字列を検索する)、このローマ字モジュールを使って文字列を数値に変換し、堅牢なソリューションを得ることができます。 –

関連する問題