如何使用Python实现Oracle数据库表字符串排除指定词并更新对应字段
解决方案
方案1:直接在Oracle数据库内执行SQL更新(推荐)
该方案无需导出数据到外部处理,性能最优,且天然按行唯一ID匹配更新,完全不存在重复Original值匹配错误的问题。
实现逻辑是先将所有例外关键词拼接为正则表达式,再对Original字段做全局替换,最后去除多余空格即可:
UPDATE OriginalWords o SET o.Clear = TRIM( REGEXP_REPLACE( o.Original, -- 拼接所有例外词为正则或模式,同时转义正则特殊字符 '\b(' || (SELECT LISTAGG(REGEXP_REPLACE(Word, '([.$^*+?()\[\]\\|])', '\\\1'), '|') WITHIN GROUP (ORDER BY id) FROM ExceptionWords) || ')\b', '', 1, 0 -- 如需忽略大小写匹配可加上参数 'i' ) );
注意:上述SQL已经对例外词中的正则特殊字符做了转义,避免特殊符号导致正则匹配异常。
方案2:Python DataFrame处理方案
如果需要在代码中处理,核心是保留原始表的唯一ID列,更新时通过ID匹配,即可完全规避重复Original值的匹配问题。
直接逐行处理实现
import pandas as pd import re import cx_Oracle # 可替换为你使用的其他Oracle连接库 # 建立数据库连接 conn = cx_Oracle.connect('用户名/密码@IP:端口/服务名') # 读取例外词列表 exception_df = pd.read_sql("SELECT Word FROM ExceptionWords", con=conn) # 对例外词做正则转义,拼接匹配模式 pattern = re.compile( r'\b(' + '|'.join(re.escape(word) for word in exception_df['Word'].tolist()) + r')\b', # flags=re.IGNORECASE # 开启则忽略大小写匹配 ) # 读取原始表,必须保留唯一id字段 original_df = pd.read_sql("SELECT id, Original FROM OriginalWords", con=conn) # 逐行生成清理后的值,无论Original是否重复,每行独立计算 original_df['Clear'] = original_df['Original'].apply(lambda x: pattern.sub('', x).strip()) # 批量更新回数据库 cursor = conn.cursor() update_sql = "UPDATE OriginalWords SET Clear = :clear_val WHERE id = :row_id" update_data = original_df[['Clear', 'id']].values.tolist() cursor.executemany(update_sql, update_data) conn.commit() # 关闭连接 cursor.close() conn.close()
字典映射处理实现
如果例外词量很大、Original重复率很高,可以先做Original值到清理结果的映射字典,减少重复计算:
# 先生成唯一Original值的映射字典 unique_original = original_df['Original'].unique() original_clear_map = { ori_str: pattern.sub('', ori_str).strip() for ori_str in unique_original } # 批量映射生成Clear列 original_df['Clear'] = original_df['Original'].map(original_clear_map) # 后续更新逻辑和上述逐行处理方案一致
内容的提问来源于stack exchange,提问作者Jeffy
相关产品推荐
相关产品推荐

