3

我得到了 db,其中表中记录的字段之一包含字符串形式的价格。字符串本身没什么大不了 - 但价格完全没有格式:

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

我想要得到的是:

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] 是价格字段

我怎样才能使它更高效(有或没有正则表达式)、更简单、更通用?

先感谢您

4

2 回答 2

1

','用空字符串 ( )替换'',然后应用这个简单的regex

>>> 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'
于 2013-06-15T09:08:56.007 回答
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']

正如您所注意到的,这可以正确处理没有美分的价格。

于 2013-06-15T09:02:40.523 回答