需要处理一个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()
无论采用哪种方法,都可以在不抛出异常的情况下正确搜索和更正运费信息。