2014-08-30 35 views
0

我一直在尋找re.match/re.search從我的文件中找到某個int。 int會有所不同,這就是爲什麼我使用正則表達式的原因。下面是該文件:將re.match/re.search轉換爲字符串

Money: 
*1,000 coins 
*2 dollars 

而且我的代碼:

import re 
amount = 2 
price = 500 * amount 
with open("money.txt", "r") as money: 
    moneyc = money.read() 
    moneyc = moneyc.strip("Money:") 
    moneyc = re.search("(\*[^0,][0-9]{0,3})?(,[0-9]{3})?(,[0-9]{3})?", moneyc) 
    moneyleft = re.sub("(\*[^0,][0-9]{0,3})?(,[0-9]{3})?(,[0-9]{3})? coins", "*"+str(int(moneyc.replace("*", "").replace(",", "")) - price)+" coins") 
    money.write("Money\n"+moneyleft) 

返回錯誤:

Traceback (most recent call last): 
    File "C:/***/money.py", line 8, in <module> 
    moneyleft = re.sub("(\*[^0,][0-9]{0,3})?(,[0-9]{3})?(,[0-9]{3})? coins", "*"+str(int(moneyc.replace("*", "").replace(",", "")) - price)+" coins") 
AttributeError: '_sre.SRE_Match' object has no attribute 'replace' 

,它只是因爲正則表達式匹配是不是字符串,但因爲我需要以某種方式將它變成一個字符串,我將如何去解決它?

我想要的文件算賬是什麼:

Money: 
*0 coins 
*2 dollars 

由於這樣的事實,價格是500 * amount和金額是2,爲什麼我一直在"coins"re.sub是因爲這裏還有美元。

+0

我想你在替換零件中包含了一些js代碼。 – 2014-08-30 12:09:28

回答

0

你有幾個問題有:

  1. 您打開該文件只是爲了與修改r閱讀,你應該使用r+
  2. 使用locale.atoi函數驗證並轉換逗號分隔的整數。

看看這個代碼:

import locale 
import re 

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 

recoins = re.compile(r'\*(\S+) coins')  
amount = 2 
price = 500 * amount 

with open('money.txt', 'r+') as money: 
    text = money.read() 
    coins = recoins.search(text).group(1) 
    newcoins = locale.atoi(coins) - price 
    money.seek(0) 
    money.truncate() 
    money.write(recoins.sub('*{:,} coins'.format(newcoins), text)) 
0
def Money1_to_Money2(i) : 
    Amount = i * 5 
    print (Amount) 

Money1_to_Money2 (10) 

這是一個簡單的貨幣貨幣代碼。 只需將要轉換的金額添加到較低的括號中,然後在5所在的位置添加轉換因子。如果您希望更有組織地將您的貨幣轉換爲貨幣名稱,而不是money1money2; i等於您在小括號中的金額乘以換算係數。

0

re.search返回的對象函數是一個匹配對象而不是一個字符串。

這就是爲什麼你的錯誤:

AttributeError: '_sre.SRE_Match' object has no attribute 'replace' 

要使用re.search嘗試後得到匹配的字符串:

moneyc = moneyc.group() 

然後moneyc.replace會工作。