所以我試圖用羅馬數字替換普通數字,但只有最后一個數字被替換,所以我想知道是否有辦法替換不同的值
sample = "Carl 5, 19 century"
numbers = re.findall(r'[0-9] ', sample)
for number in numbers:
num_int = int(number)
roman_number = int_to_Roman(num_int)
new_string = sample.replace(number, roman_number)
>>> Carl 5, XIX century
這是其他一些結果
sample = "Carl 19, 19 century"
>>> Carl XIX, XIX century
sample = "Carl 5"
>>> Carl V
uj5u.com熱心網友回復:
您的代碼中的以下行采用原始字串sample并將其替換為number,roman_number但它存盤在變數new_string中。在下一次迭代中,代碼將再次獲取原始字串(它沒有存盤上一次迭代的替換)并替換為number,roman_number這就是為什么當您列印new_string回圈后,它只顯示最后一個被替換的數字(這是回圈最后一次迭代中的替換)。
new_string = sample.replace(number, roman_number)
對此有 2 個修復。一種是將修改后的字串存盤在樣本變數本身中,以便回圈可以獲取最后一次迭代的結果并進行進一步的替換。
sample = sample.replace(number, roman_number)
如果要保留原始變數sample,可以在回圈之前創建變數的副本,并對變數進行替換操作new_string。
sample = "Carl 5, 19 century"
numbers = re.findall(r'[0-9] ', sample)
new_string = sample
for number in numbers:
num_int = int(number)
roman_number = int_to_Roman(num_int)
new_string = new_string.replace(number, roman_number)
編輯:
正如 tdelaney 所指出的,也可以替換較大數字中的較小數字部分(例如 15 中的 5)。要解決此問題,請以相反的順序對數字進行排序(首先是較大的數字)
numbers = re.findall(r'[0-9] ', sample)
numbers = sorted(numbers, reverse=True, key=len)
uj5u.com熱心網友回復:
您可以使用re.sub()可呼叫(函式)并將其傳遞給repl引數。這個可呼叫物件接受一個引數——匹配物件,并回傳該匹配的替換,因此它可能是一個簡單的包裝器,從匹配物件中提取匹配字串并將其傳遞給int_to_Roman:
def int_to_Roman_wrapper(match_obj):
return int_to_Roman(int(match_obj.group(0)))
sample = 'Carl 5, 15 century'
new_string = re.sub(r"\d ", int_to_Roman_wrapper, sample)
這使
new_string = 'Carl V, XV century'
這不存在str.replacetdelaney 在他們的評論中提到的方法的問題:
.replace將替換整個字串中的數字,即使它們稍后是更大數字的一部分。sample = "Carl 5, 15 century"將失敗,因為 15 中的 5 將在第一場比賽中被替換。第二場比賽會嘗試替換15,但它已經被破壞了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437666.html
上一篇:使用for回圈在R中利用spotifyrget_artist_audio_features函式,跳過回圈中的錯誤
