【问题标题】:How can I deformat string with prices in python?python - 如何在python中使用价格格式化字符串?
【发布时间】:2023-03-23 07:43:02
【问题描述】:

我得到了 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] 是价格字段

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

提前谢谢你

【问题讨论】:

    标签: python regex string formatting


    【解决方案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'
    

    【讨论】:

    • re.compile() 非常适合在正则表达式中显示不变性。
    • 感谢您的回答!
    • @AKarpun 很高兴这有帮助。
    【解决方案2】:

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

    正如你所注意到的,这个处理正确的价格没有美分。

    【讨论】:

    • 但是第三个的答案应该是单独3.50
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2011-07-28
    相关资源
    最近更新 更多