2015-10-30 89 views
2

我需要一種方法來用一個字符串中的數字來替換所有出現的數字,並用它們的羅馬數字等值。用羅馬數字替換數字

例子:

  • My 3 Top Tips: Part 19應該輸出My III Top Tips: Part XIX
  • Se7en應該輸出Se7en(因爲性格7不是一個 '字')

這似乎是最好的包在那裏的工作是roman。不幸的是,它不會接受包含文本和數字的字符串。

我的想法是:

  1. split()文本
  2. 迭代每個word
  3. word一個數字,如果是使用roman
  4. 取代它再次融合在一起名單

這看起來很亂,容易出錯,而且不是非常pythonic。有什麼更好的方法來做到這一點?用正則表達式或列表理解,還是兩者結合都可能?

+0

我會用正則表達式! – SIslam

+0

是的,我很確定這就是要走的路!但是,我不知道如何用函數輸出替換一個匹配項 - 使用匹配本身作爲參數 – Arj

+1

你看過[re.sub文檔](https://docs.python。組織/ 3 /庫/ re.html#應用re.sub)?我想不是,因爲如果你有,你會讀到「如果repl是一個函數,它被稱爲模式的每個非重疊事件。該函數接受一個匹配對象參數,並返回替換字符串。」 – rici

回答

3

要查找都沒有的話較大的部分號碼,使用正則表達式與word boundary anchors

regex = re.compile(r"\b\d+\b") 

將只匹配在你的榜樣319,但不7

因此,使用write_roman()this answer,你可以做

def repl(match): 
    return write_roman(int(match.group(0))) 

print(regex.sub(repl, "My 3 Top Se7en Tips: Part 19")) 

,並會得到

My III Top Se7en Tips: Part XIX 
+0

你應該添加用於將數字翻譯爲羅馬的代碼,否則你不會回答他的問題(儘管你幾乎解決了重要的部分) – yzT