需求导向的正则表达式

目录

re.sub

[需求:把 1. 2.这些序号转成(1) (2)](#需求:把 1. 2.这些序号转成(1) (2))

[需求:反过来,把(1)->1. ,(2)=》2. 。](#需求:反过来,把(1)->1. ,(2)=》2. 。)

[需求:把出现的 1 2 3都转成下标](#需求:把出现的 1 2 3都转成下标)

进阶1!只想让化学符号(NH3)有此效果,不能让序号这种数字也转换

------下标很长时,如C_60要怎么办​编辑

再加上正负号的替换=》上标,如铵根离子NH4+

需求:上标替换10^2=>10²



import re

*:(0,)

+:(1,)

re.sub

re.sub(匹配的正则表达式,替换后的正则表达式,待处理的字符串)

即:re.sub(pattern,repl,string,可选参数count是替换最大次数,flags是匹配模式如多行模式/忽略大小写)

需求:把 1. 2.这些序号转成(1) (2)

详细要求:

  1. xxx(有个空格)

1.xxx

都要转成(1)

错误0:要把点号和数字放在不同分组,然后只取数字的分组,否则点号会保留

错误1:.未转义

错误2:\d 只是表示一位数字

改正:注意,第二个引号里的\1表示第一个分组,\3是第三个分组,|是或,分组是第几个是算上|也是从左向右数的。

python 复制代码
import re
str0="1. 2. (3) 12. 10000000. 123.lalal"
re.sub(r"(\d+)(\. )|(\d+)(\.)",r"(\1\3)",str0)

只要写一个替换模式,就会把所有满足这种模式的均替换。

需求:反过来,把(1)->1. ,(2)=》2. 。

python 复制代码
import re
str0="1..2..(3) 12....10000000. 123.lalal (4)(3838339300)(89)"
re.sub(r"\((\d+)\)|((\d+))",r"\1. \2. ",str0)

需求:把出现的 1 2 3都转成下标

输入:x2 y3

输出:x² y³

现在有一个列表,存储了从0-9的下标

lst="₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉".split()

思路:还记得回调函数吗?把函数名作为参数输入。

re.sub(r"待匹配","待替换------此处可以写一个函数,替换成你想要的")

粗糙版:

进阶1!只想让化学符号(NH3)有此效果,不能让序号这种数字也转换

这里就需要让正则表达式前面有东西(字母)

首先测试一下,如果不使用回调函数

两个括号的内容会一起被替换。

如果第二个括号写了组号

就是把([a-zA-Z]+)(\d)替换成₆+第一个组里的东西,如果想保留某个分组的内容,一定要在第二个括号写明!

你看,这个就被替换没了

初具规模

------下标很长时,如C_60要怎么办

再加上正负号的替换=》上标,如铵根离子NH4+

字母(数字)± =》字母(数字)⁺ ⁻

python 复制代码
import re
lst="₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉".split()
str0="1..2..(3) 12....10000000. 123.NH3 H2 o2 NH4+ NO3- K+(Fe3O4)C12 C60000(Rukawa111111)(89)"
def rplc1(a):#a是match对象,要提取字符串,需要使用group  group(0)是全部,group(i)是第i个括号里的
    b=a.group(2)
    numList=list(b)
    ans=a.group(1)
    for i in range(len(numList)):
        ans+=lst[int(numList[i])]
    
    return ans
str1=re.sub(r"([a-zA-Z]+\d*)\+",r"\1⁺",str0)
str1=re.sub(r"([a-zA-Z]+\d*)\-",r"\1⁻",str1)
re.sub(r"([a-zA-Z]+)(\d+)",rplc,str1)

需求:上标替换10^2=>10²

和替换下标很类似,不同的是需要去掉^,这个就在连接分组的时候忽略^所在分组即可

数字之间有空格!

因为我给的列表两个上标之间不一定只有一个空格

(并不是,就是编码的问题)

#这里需要re.split

python 复制代码
re.split("\s+","⁰ ¹ ² ³       ⁴ ⁵ ⁶ ⁷ ⁸ ⁹")

并不用,split已经帮我们做好额

python 复制代码
import re

lst2="⁰ ¹ ² ³       ⁴ ⁵ ⁶ ⁷ ⁸ ⁹".split()
str0="1..9^2..(3) 12....3^10000000. 7^1234567890987654321 2^123.NH3 H2 o2 NH4+ NO3- K+(Fe3O4)C12 C60000(Rukawa111111)(89)"
def sb(a):
    b=a.group(2)
    numList=list(b)
    ans=""
    for i in range(len(numList)):
        ans+=lst2[int(numList[i])]
    return ans
re.sub(r"(\^)(\d+)",sb,str0)
相关推荐
xiaoye37087 分钟前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
ZTLJQ1 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
夏霞2 小时前
c# signlar 客户端传递参数给服务端配置方法
开发语言·c#
迷藏4942 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务2 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
i建模2 小时前
将Edge浏览器的标签页从顶部水平排列**移至左侧垂直侧边栏
前端·edge
2301_818419012 小时前
C++中的解释器模式变体
开发语言·c++·算法
跟着珅聪学java2 小时前
js编写中文转unicode 教程
前端·javascript·数据库
英俊潇洒美少年3 小时前
Vue3 深入响应式系统
前端·javascript·vue.js
摇滚侠3 小时前
Java 项目《谷粒商城-1》架构师级Java 项目实战,对标阿里 P6-P7,全网最强,实操版本
java·开发语言