如何在python中使用价格对字符串进行变形?

如何在python中使用价格对字符串进行变形?,python,regex,string,formatting,Python,Regex,String,Formatting,我得到了db,其中表中记录中的一个字段包含字符串形式的价格。 字符串本身并不是什么大问题,但价格是完全无格式的: $12,000.50 $3.50 From $3.50 to $12,000.50 我想得到的是: 12000.50 3.50 3.50 把它从“$”和“,”中去掉,只留下两位的第一位 我编写了这段代码,它适用于第一个到第二个示例,但在最后一个示例中失败(sqlite语法错误-显然,它给出了两个数字) 以下是代码: for every_line: found

我得到了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()
其中,每一行[0]是索引字段,[9]是价格字段

我如何使它更高效(有或没有正则表达式),更简单和更通用


提前谢谢

您的问题是使用
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']

正如您所注意到的,这个句柄正确地定价,没有美分。

用空字符串(
'
)替换
,'
),然后应用这个简单的
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'

但是第三个答案应该是3.50谢谢你的回答
re.compile()
非常适合在正则表达式中显示不变性。感谢您的回答@阿卡彭很高兴这有帮助。