re.sub 指定位置插入

本文详细介绍了正则表达式中group()函数的使用方法,包括如何通过group(0), group(1)等获取匹配的字符串部分。同时,解释了re.sub函数中特殊字符1的作用,帮助读者更好地理解并运用正则表达式的分组功能。

先说下group()

group() 用来提出分组截获的字符串,举个例子:

- group(0)就是匹配正则表达式整体结果

- group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

re.sub

其中“\1”表示括号内的部分

import os import subprocess import re import_library_name_prefix = r'tcbn07_bwph240l11p57pd_base_lvt' library_name_prefix = "H3STC6TP57G11LBA01" def apply_sed_commands(file_path, cmds): for cmd in cmds: subprocess.run(['sed', '-i', cmd, file_path], check=True) def process_lib_file(file_path, library_name_prefix, import_library_name_prefix): file_name = os.path.basename(file_path) prefix = re.search(import_library_name_prefix, file_name) prefix_str = prefix.group() if prefix else "" match = re.search( rf'{import_library_name_prefix}' r'([a-zA-Z0-9]+_[a-zA-Z0-9]+_[a-zA-Z0-9]+)' r'(?:_.*?)?\.lib', file_name ) suffix_str = "" if match: tmp = match.group(1) tmp = re.sub(r'([0-9])p([0-9]+)v', r'\1P\2V', tmp) tmp = re.sub(r'([0-9]+)c', r'\1C', tmp) clean_suffix = re.sub(r'[^a-zA-Z0-9]', '', tmp).upper() suffix_str = clean_suffix original_suffix_pattern = re.escape(match.group(1)) sed_commands = [ '1,41d', '/date/d', '/comment/d', '/revision/d', r's/\(nom_process.*\);.*/\1;/', r's/\(process.*\);.*/\1;/', 's/ZeroWireload/wl0/g', '/slew_upper_threshold_pct_fall/,/leakage_power_unit/{//!d}', r's/^\s*\(leakage_power_unit\)/\1/', r's/^\s*\(default_cell_leakage_power\)/\1/', '84,88d', '/Design/d', '/\/\* ---------/d', '/--------- \*\//d', f's/{re.escape(prefix_str)}/{re.escape(library_name_prefix)}/g', f's/{original_suffix_pattern}/{clean_suffix}/g', f's/{re.escape(library_name_prefix + clean_suffix)}/{re.escape(library_name_prefix)}_{clean_suffix}/g', 's/_cbest_CCbest_T//g', 's/_cworst_CCworst_T//g', 's/_typical//g', 's/VM40C/VN40C/g', ] 详细解释上述代码的含义,每一句每一字符 apply_sed_commands(file_path, sed_commands) if __name__ == "__main__": for lib_file in [f for f in os.listdir('.') if f.lower().endswith('.lib')]: print(f"Start to update lib : {lib_file}") process_lib_file(lib_file, library_name_prefix, import_library_name_prefix)
最新发布
11-28
def revise_content(self): reply = QMessageBox.question( self, '保存记录', '是否确认保存当前内容到数据库?\n如果有图片必须上传到附件文档!', QMessageBox.Yes | QMessageBox.No, QMessageBox.No ) if reply != QMessageBox.Yes: return self.ui.textEdit.setReadOnly(True) # 获取纯文本内容 text = self.ui.textEdit.toPlainText() # 定义关心的标题 target_titles = ['名称'] title_pattern = '|'.join(map(re.escape, target_titles)) pattern = rf'【({title_pattern})】(.*?)(?=(?:【|$))' matches = re.findall(pattern, text, re.DOTALL) def clean_content(content): content = content.replace('\ufffd', '') # 清理替换字符 content = re.sub(r'<img\b[^>]*>', '', content) # 移除 img 标签 content = re.sub(r'[a-zA-Z]:\\[^\\<>:"|?*\n]+?\.(?:jpg|jpeg|png|gif|bmp)', '', content) # 本地路径 content = re.sub(r'data:image/[^;]+;base64,[a-zA-Z0-9+/=\s]+', '', content) # base64 图片 content = re.sub(r'\s+', ' ', content).strip() return content extracted_content = { title.strip(): clean_content(content) for title, content in matches } name = extracted_content.get('名称', '').strip() if not name: QMessageBox.warning(self, "错误", "未检测到【名称】字段,无法保存!") return # 获取 HTML 内容用于存储 html = self.ui.textEdit.toHtml() # 弹出选择目标表 table_list = [ '古方', '验方', '秘方', '偏方', '单方', '膳食方', '食疗方', '酒疗方', '茶疗方', '浴蒸方', '泡脚方', '敷药方', '液体膏药方', '黑高药方', '药对', '穴位推拿' ] table_name, ok = QInputDialog.getItem( self, "选择目标表", "请选择要插入或更新数据的数据库表名:", table_list, 0, False ) if not ok: QMessageBox.warning(self, "取消", "未选择目标表,操作已取消。") return # ========== 判断是 INSERT 还是 UPDATE ========== query = QSqlQuery() # 先查询是否存在该名称的数据 check_sql = f"SELECT 名称 FROM {table_name} WHERE 名称 = ?" if not query.prepare(check_sql): QMessageBox.critical(self, "错误", "数据库查询准备失败!") print("查询语句准备失败:", query.lastError().text()) return query.addBindValue(name) exists = query.exec_() and query.next() attachment_value = getattr(self, 'current_folder_path', '').strip() if not attachment_value: print("⚠️ current_folder_path 不存在或为空,附件字段将留空") # === 执行 INSERT 或 UPDATE === if exists: # 执行 UPDATE update_sql = f""" UPDATE {table_name} SET 内容 = ?, 附件 = ? WHERE 名称 = ? """ if not query.prepare(update_sql): QMessageBox.critical(self, "错误", "更新语句准备失败!") print("UPDATE 准备失败:", query.lastError().text()) return query.addBindValue(html) query.addBindValue(attachment_value or "") query.addBindValue(name) # WHERE 条件 if query.exec_(): show_toast(f"✅ 记录已更新至表 `{table_name}`!") print(f"更新成功: {name}") else: QMessageBox.critical(self, "错误", "更新数据库失败!") print("更新失败:", query.lastError().text()) else: # 执行 INSERT insert_sql = f""" INSERT INTO {table_name} (名称, 内容, 附件) VALUES (?, ?, ?) """ if not query.prepare(insert_sql): QMessageBox.critical(self, "错误", "插入语句准备失败!") print("INSERT 准备失败:", query.lastError().text()) return query.addBindValue(name) query.addBindValue(html) query.addBindValue(attachment_value or "") if query.exec_(): show_toast(f"🆕 新记录已插入表 `{table_name}`!") print(f"插入成功: {name}") else: QMessageBox.critical(self, "错误", "插入数据库失败!") print("插入失败:", query.lastError().text()) # 刷新界面数据 self.load_fixed_column_data() 给出完整的修改后的代码
10-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值