将re.match / re.search转换为字符串

时间:2014-08-30 11:42:16

标签: python regex

我一直在考虑让re.match / re.search从我的文件中找到某个int。 int会有所不同,这就是为什么我首先使用正则表达式。这是文件:

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是因为还有美元。

3 个答案:

答案 0 :(得分:0)

你有几个问题:

  1. 您只能使用修饰符r打开文件,您应该使用r+
  2. 使用locale.atoi函数验证和转换以逗号分隔的整数。
  3. 看看这段代码:

    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))
    

答案 1 :(得分:0)

def Money1_to_Money2(i) :
    Amount = i * 5
    print (Amount) 

Money1_to_Money2 (10)

这是货币代码的简单货币。 只需将您想要转换的金额添加到较低的括号中,然后在5所在的位置添加转换因子。如果您希望它更有条理,请将您的货币设置为货币名称,而不是money1money2; i等于您在较低括号中的金额乘以转换因子。

答案 2 :(得分:0)

re.search函数返回的对象是匹配对象而不是字符串。

这就是你得到错误的原因:

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

要在使用re.search后获取匹配的字符串,请尝试:

moneyc = moneyc.group()

然后moneyc.replace将有效。