本文共 1636 字,大约阅读时间需要 5 分钟。
要对mysql中的中文数据做正则匹配,就想用python,简单实用,不过碰到中文乱码问题,各种搜索,折腾了好久,总算解决了,基本上的原则就是转为utf8编码。
具体为从表中的"title"取出中文,用正则匹配其中的年级,再写入"grade"。
python版本:python-2.7.12.amd64。mysql版本:mysql-5.7.13-winx64。系统是Windows7。
python文件编码为UTF-8。
mysql设置:
=======================================
[mysqld]
sql-mode="MYSQL40"
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
[client]
default-character-set=utf8
=========================================================
python代码:
#!/usr/bin/python# -*- coding: UTF-8 -*-import MySQLdbimport re# 打开数据库连接,注意要设置charset='utf8'。db = MySQLdb.connect("localhost","root","123456","database",charset='utf8')# 使用cursor()方法获取操作游标 cursor = db.cursor()#查找的sql语句sql = "select id,title from ytable"try: # 执行SQL语句 cursor.execute(sql) # 获取所有记录列表 results = cursor.fetchall()except MySQLdb.Error,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1])#匹配年级的正则,注意(一|二|三|四|五|六|七|八|九)不能用[一二三四五六七八九]代替,否则出错grade = r'(((初|高)中?)?(一|二|三|四|五|六|七|八|九)年级\s*((\(|()(上|下)(\)|)))?|(初|高)(一|二|三)\s*((\(|()(上|下)(\)|)))?)'pattern = re.compile(grade)jiLu = 0for row in results: id = row[0] title = row[1].encode('UTF-8') #从数据库取出的中文字符编码为Unicode,要转为utf8,否则正则匹配出错 match = pattern.search(title) #"title"里面可能包含年级,如匹配到年级,写入"grade" if match: try: print id,match.group() sql_1 = "update ytable set grade = '%s' where id = %s" % (match.group(),id) cursor.execute(sql_1) db.commit() except MySQLdb.Error,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1]) # 发生错误时回滚 db.rollback() #显示处理条目数 jiLu += 1 print jiLu# 关闭数据库连接db.close()
转载地址:http://oktni.baihongyu.com/