如何在SQLite数据库中搜索多个正则表达式子字符串并对其进行更正

需要处理一个SQLite数据库中的销售记录表,该表的一个字段包含了有关运费的信息,该字段中的值可能有以下三种情况:

  • 价格:例如“£15.20”
  • 免费:例如“free”
  • 未指定:例如“not specified”
    在这里插入图片描述

目标是将所有运费信息规范化为上述三种可能性之一。

原先使用的正则表达式代码如下:

import re

def correct_shipping(db_data):
    pattern=re.compile("\£(\d+.\d+)") #search for price
    pattern_free=re.compile("free") #search for free shipping
    pattern_not=re.compile("not specified") #search for shipping not specified 

    for every_line in db_data:
        try:
            found=pattern.search(every_line[13].replace(',','')).group(1)
        except:
            try:
                found=pattern_free.search(every_line[13]).group()
            except:
                found=pattern_not.search(every_line[13]).group()

        if found:
            query="UPDATE MAINTABLE SET Shipping='"+found+"' WHERE Id="+str(every_line[0])
            db_cursor.execute(query)
    db_connection.commit()

运行代码时,抛出异常:AttributeError: 'NoneType' object has no attribute 'group'。这是因为当找不到任何匹配项时,正则表达式函数返回 None,导致后续尝试调用 group() 方法时发生错误。

解决方案

为了解决这个问题,可以采取以下几种方法:

  • 使用 if 语句检查是否找到了匹配项。 这种方法简单且直接,但需要为每个正则表达式添加额外的 if 语句,代码可能会变得冗长。
for every_line in db_data:
    match = pattern.search(every_line[13].replace(',',''))
    if match:
        found = match.group(1)

    match = pattern_free.search(every_line[13])
    if match:
        found = match.group()

    match = pattern_not.search(every_line[13])
    if match:
        found = match.group()

    if found:
        query="UPDATE MAINTABLE SET Shipping='"+found+"' WHERE Id="+str(every_line[0])
        db_cursor.execute(query)
    db_connection.commit()
  • 将正则表达式组合为一个正则表达式,并使用 find() 方法查找匹配项。 这种方法可以简化代码,但正则表达式可能变得更加复杂。
import re

pattern = re.compile("(\£(\d+.\d+))|(free)|(not specified)")

for every_line in db_data:
    match = pattern.search(every_line[13].replace(',',''))
    if match:
        found = match.group(1) or match.group(2) or match.group(3)

    if found:
        query="UPDATE MAINTABLE SET Shipping='"+found+"' WHERE Id="+str(every_line[0])
        db_cursor.execute(query)
    db_connection.commit()
  • 使用 re.findall() 方法查找所有匹配项。 这种方法可以一次性找到所有匹配项,但可能需要进行额外的处理以提取所需的子字符串。
import re

pattern = re.compile("(\£(\d+.\d+))|(free)|(not specified)")

for every_line in db_data:
    matches = pattern.findall(every_line[13].replace(',',''))
    if matches:
        found = matches[0][1] or matches[0][2] or matches[0][3]

    if found:
        query="UPDATE MAINTABLE SET Shipping='"+found+"' WHERE Id="+str(every_line[0])
        db_cursor.execute(query)
    db_connection.commit()

无论采用哪种方法,都可以在不抛出异常的情况下正确搜索和更正运费信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值