如何在Python中格式化带价格的字符串?

3

我得到了一个数据库,其中一张表中的记录字段包含以字符串形式表示的价格。 字符串本身并不是什么大问题,但价格完全没有格式:

$12,000.50
$3.50
From $3.50 to $12,000.50

what I trying to get is:

12000.50
3.50
3.50

去掉所有"$"和",",只留下前两位数字。

我写了这段代码,对前两个例子有效,但最后一个失败了(sqlite语法错误 - 显然它给了我两个数字)。

以下是代码:

for every_line:
           found=re.findall(r"\d.\.?",every_line[9])
           db_cursor.execute("UPDATE MAINTABLE SET Price="+"".join(found)+" WHERE Id="+str(every_line[0]))
db_connection.commit()

在这里,每个"every_line[0]"代表索引字段,而"[9]"则代表价格字段。

我该如何使其更加高效(使用或不使用正则表达式),更加简单和通用?

非常感谢您的帮助。

2个回答

1

','替换为空字符串(''),然后应用这个简单的正则表达式

>>> r = re.compile("\$(\d+.\d+)")

>>> r.search(strs.replace(',','')).group(1)
'12000.50'

>>> strs = '$3.50'
>>> r.search(strs.replace(',','')).group(1)
'3.50'

>>> strs = 'From $3.50 to $12,000.50'
>>> r.search(strs.replace(',','')).group(1)
'3.50'

1
re.compile() 函数非常适合展示正则表达式中的不变性。 - Ignacio Vazquez-Abrams

0

你的问题在于使用findall会检索出所有匹配的文本片段。但是,在最后一个例子中有两个匹配的片段:

>>> re.findall(r"\d.\.?", "From $3.50 tp $12,000.50" )
['3.', '50', '12', '00', '0.', '50']

将它们连接起来不会产生可以被视为数字的东西:

>>> "".join(['3.', '50', '12', '00', '0.', '50'])
'3.5012000.50'

假设你所有的价格都以$开头,而且你只对第一个价格感兴趣,那么可能更好的方法是:
>>> import re
>>> import string

>>> p = [ "$12,000.50", "$3.50", "From $3.50 tp $12,000.50", "$12,000" ]
>>> [re.search(r"\$(\d+(\.\d+)?)", string.replace(price,",","")).group(0) for price in p]
['$12000.50', '$3.50', '$3.50', '$12000']

>>> [re.search(r"\$(\d+(\.\d+)?)", string.replace(price,",","")).group(1) for price in p]
['12000.50', '3.50', '3.50', '12000']

正如您所注意到的,此句柄正确处理没有“分”的价格。

1
但第三个的答案应该只是3.50。 - Aswin Murugesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接