2014-08-30 31 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会工作。