Python 正则分割字符串并提取匹配的记号和关键词

需求是:原字符串内含有特殊记号,比如"V_{CC} = V_{DD}",其中_{CC} 是latex 的下标语法,实际显示出来是下面这样:

V C C = V D D V_{CC} = V_{DD} VCC=VDD

现在要把下标部分提取出来,并把原字符串用这个记号切割开,也就是把原字符串切割成:"V", "CC", " = V", "DD",这种感觉,方便之后单独处理下标。re 库里官方的split 函数太“简陋”了,不太好使。

函数代码

总之代码如下:

import re
from typing import Union, List, Tuple, Optional

def text_find_and_split(pattern: Union[str, re.Pattern], text: str) -> List[Tuple[str, Optional[re.Match]]]:
    '''
    将字符串按正则匹配分割,返回被分割的字符串片段和匹配结果,匹配的片段会从原字符串中被整体切割出去。
    
    比如:原字符串: "AAAA $01$ BBBB $02$ CCCC" 正则:r"$(\d+)$",
    切割后的字符串变成"AAAA ", " BBBB ", " CCCC" ,被匹配的片段 "$01$" 和 "$02$" 通过Match 对象返回.
    
    字符串片段和Match 对象被混合起来作为列表返回,每个列表元素是一个二元组,前者是匹配位置前的字符串片段,后者是Match 对象.
    上面的例子的返回形式为:
    
    [
         ("AAAA ", Match("$01$")),
         (" BBBB ", Match("$02$")),
         (" CCCC", None)
    ]
    
    最后一个片段后面没有匹配,所以Match 对象用None 代替
    
    Parameters
    ----------
    pattern : Union[str, re.Pattern]
        正则表达式,可以是字符串或编译后的Pattern 对象.
    text : str
        原字符串.

    Returns
    -------
    result_list : List[Tuple[str, Optional[re.Match]]]
        返回值是一个列表,其中每个元组包含两个元素,前者是匹配前的字符串片段,后者是Match 对象.

    '''
    m_iter = pattern.finditer(text) if isinstance(pattern, re.Pattern) else re.finditer(pattern, text)
    result_list = []
    last_stop = 0
    for m in m_iter:
        start, stop = m.span()
        s = text[last_stop: start]
        last_stop = stop
        result_list.append((s, m))
    
    result_list.append((text[last_stop:], None))
    return result_list

注释里说的应该够清楚了。

使用效果

要处理的字符串是:

s = r"V_{CM}=V_{S} / 2,V_{OUT}=V_{S} / 2,V_{S}=V_{+} - V_{-} =5V,V_{+} =2.5V,V_{-} = -2.5V"

用来匹配记号的正则是:

sub_pattern = r"_\{(.+?)\}"
p = re.compile(sub_pattern)  # 可能编译后正则匹配会更快吧

函数调用:

text_find_and_split(p, s) # 第一个参数可以是字符串sub_pattern,也可以是编译后的p

切割结果:

lm = [('V', <re.Match object; span=(1, 6), match='_{CM}'>),
 ('=V', <re.Match object; span=(8, 12), match='_{S}'>),
 (' / 2,V', <re.Match object; span=(18, 24), match='_{OUT}'>),
 ('=V', <re.Match object; span=(26, 30), match='_{S}'>),
 (' / 2,V', <re.Match object; span=(36, 40), match='_{S}'>),
 ('=V', <re.Match object; span=(42, 46), match='_{+}'>),
 (' - V', <re.Match object; span=(50, 54), match='_{-}'>),
 (' =5V,V', <re.Match object; span=(60, 64), match='_{+}'>),
 (' =2.5V,V', <re.Match object; span=(72, 76), match='_{-}'>),
 (' = -2.5V', None)]

然后再做一些小处理,就可以把原字符串插入到word 里面,并且自动添加上下标格式:

for i in lm:
    s, m = i
    s_run = cp0.add_run(s)
    s_run.font.name = "Times New Roman"
    if m is None:
        break
    gs = m.groups()
    assert len(gs) == 1
    sub_text = gs[0]
    sub_run = cp0.add_run(sub_text)
    sub_run.font.name = "Times New Roman"
    sub_run.font.subscript = True

效果如下图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349255.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python之数据可视化基础

目录 一 JSON数据格式转换 二 pyecharts模块 三 Pyecharts入门 四 数据可视化之疫情折线图 一 JSON数据格式转换 什么是JSON? JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它以易于阅读和编写的方式来表示结构化数据。JSO…

构建未来学堂:在线教育系统开发技术实践

在当今数字化时代&#xff0c;在线教育系统的开发越发显得至关重要。本文将带你深入了解在线教育系统的开发&#xff0c;涉及到关键的技术实践和代码示例。我们将采用现代化技术栈&#xff0c;为未来学堂的搭建提供实用的指南。 技术栈选择 在开始实际的开发之前&#xff0c…

在IDEA中创建SpringBoot项目

概述 SpringBoot是由Pivotal团队提供的全新的框架&#xff0c;其设计的目的是用来简化Spring应用的初始搭建以及开发过程。 传统方式构建Spring应用程序 导入依赖繁琐 依赖冲突 项目配置繁琐 SpringBoot特性 1、起步依赖 本质上就行一个Maven坐标&#xff0c;整合了完成一…

虚幻UE 插件-像素流送实现和优化

本笔记记录了像素流送插件的实现和优化过程。 UE version&#xff1a;5.3 文章目录 一、像素流送二、实现步骤1、开启像素流送插件2、设置参数3、打包程序4、打包后的程序进行像素流参数设置5、下载NodeJS6、下载信令服务器7、对信令服务器进行设置8、启动像素流送 三、优化1、…

机电制造ERP软件有哪些品牌?哪家的机电制造ERP系统比较好

机电制造过程比较复杂&#xff0c;涵盖零配件、采购、图纸设计、工艺派工、生产计划、物料需求计划、委外加工等诸多环节。而供应链涉及供应商的选择、材料采购价格波动分析、材料交货、品质检验等过程&#xff0c;其中某个环节出现问题都可能会影响产品交期和经营效益。 近些…

设计模式_组合模式_Composite

案例引入 学校院系展示 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系 【传统方式】 将学院看做是学校的子类&#xff0c;系是学院的子类&#xff0c;小的组织继承大…

第2章 信息技术发展——2.1 信息技术及其发展

文章目录 2.1 信息技术及其发展2.1.1 计算机软硬件2.1.2 计算机网络1.网络标准协议1)OSI2)IEEE802协议族3)TCP/IP 2.软件定义网络3.第五代移动通信技术 2.1.3 存储和数据库1.存储技术2.数据结构模型1)层次模型2)网状模型3)关系模型 3.常用数据库类型1)关系型数据库2)非关系型数…

Docker镜像的创建

基于现有镜像创建 先用现有镜像创建启动容器 docker run 再进入容器进行内容更新 docker exec -it 最后提交成新的镜像 docker commit 然后将修改后的容器提交为新的镜像&#xff0c;需要使用该容器的 ID 号创建新镜像 进入容器可查看相关性能 基于本地模板创…

【软考上岸-备考系统集成项目管理工程师1】

文章目录 今日座右铭&#xff1a;最好的偷懒方式&#xff0c;就是一次做好。 文章目录 文章目录前言一、系统集成项目管理工程师作用二、系统集成项目管理工程师报名要求三、软考报名流程四、教材参考说明总结 前言 计算机信息系统集成项目管理师对应资格考试名称&#xff1a;…

FPGA高端项目:Xilinx Zynq7020系列FPGA多路视频拼接 工程解决方案 提供6套工程源码和技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我已有的FPGA视频拼接叠加融合方案本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Artix7 系列FPGA上的应用 3、设计思路框架视频源选择ov5640 i2c配置及采集动态彩条多路视频…

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式&#xff0c;以相关技术概念为起点&#xff0c;实际环境搭建&#xff0c;程序部署为终点&#xff0c;从0到1的实操演示的学习方式&#xff0c;一步一步&#xff0c;保姆级的方式学习k8…

语音生成、写作增强、论文辅助、英文学习,AI原生应用精彩推荐一箩筐!

崭新的2024年已然降临&#xff0c;飞桨星河社区再次涌现出诸多精彩纷呈的AI原生应用&#xff0c;快来一同探索&#xff0c;发现这些应用带来的无限惊喜与可能吧&#xff01; 语音生成&#xff1a;10音色自由选择 应用介绍 本应用基于ERNIE SDK和语音合成工具&#xff0c;可以输…

“情暖寒冬 温暖相伴”关爱慰问

岁末寒冬&#xff0c;春节将至&#xff0c;为持续巩固脱贫攻坚成果&#xff0c;扎实助力乡村振兴&#xff0c;市融媒体中心开展“情暖寒冬 温暖相伴”慰问活动。 1月25市融媒体中心联合我市志愿者协会在南村镇忽树庄村开展“情暖寒冬 温暖相伴”慰问活动&#xff0c;为脱贫户送…

爬虫js逆向分析——x平台(实现)

爬虫js逆向分析——x平台&#xff08;实现&#xff09; &#xff08;仅供学习&#xff0c;本案例只是分析流程没有账号&#xff09;网址&#xff1a;https://xuexi.chinabett.com/ 1.分析请求包格式 打开控制台&#xff0c;并勾选保存日志&#xff0c;然后点击登录看发送了什…

【自然语言处理的发展】

自然语言处理的发展 自然语言处理&#xff08;NLP&#xff09;作为人工智能领域的一个分支&#xff0c;旨在让计算机理解和生成人类语言。随着深度学习和大数据技术的不断进步&#xff0c;NLP在近年来取得了显著的突破。本文将探讨NLP技术的发展历程、最新技术进展以及未来展望…

Debezium发布历史89

原文地址&#xff1a; https://debezium.io/blog/2020/03/31/debezium-newsletter-01-2020/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 时事通讯 01/2020 2020 年 3 月 31 日 作者&#xff1a; 克…

力扣刷MySQL-第八弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

Eureka的实操--中篇

Eureka的实操 2、安全连接方式 Eureka的安全连接可以通过以下步骤实现&#xff1a; 添加依赖&#xff1a;在项目的pom.xml文件中添加Eureka的依赖。配置安全连接&#xff1a;在项目的application.yml或application.properties文件中添加Eureka的安全连接配置。具体包括设置安…

RabbitMQ简单模式和工作模式

RabbitMQ 是一个消息队列中间件&#xff0c;用于在分布式系统中进行消息传递。在 RabbitMQ 中&#xff0c;有几种工作模式&#xff0c;其中简单模式和工作模式是其中两种基本的模式之一。 简单模式&#xff08;Simple Mode&#xff09;&#xff1a; 在简单模式中&#xff0c;有…

C++大学教程(第九版)6.48掷骰子游戏的改进

文章目录 题目代码运行截图 题目 (掷骰子游戏的改进)请修改图6.11 中的双游戏序允许家下赌注。 把序中运行掷骰子游戏的部分打包为一个函数。 初始化变量 bankBalance 为 1000美元。 提示玩家输入赌注数&#xff1a;wager。 利用一个 while 循环来检查 wager 是否小于或等于 b…