Python进阶(1):正则表达式

正则表达式

正则表达式(Regular Expression,常简写为regex 或者 RE),又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。目前,正则表达式已经在各种计算机语言(如Java、C#和Python 等)中得到了广泛的应用和发展。

行定位符

行定位符就是用来描述字符串的边界。"^"表示行的开始;"$"表示行的结尾。

元字符

限定符

排除字符

匹配不符合指定字符集合的字符串,例如:

\^a-zA-Z

该表达式用于匹配一个不是字母的字符。

转义字符

使用\来进行转义,例如小数点.需要使用\.来转义

分组

使用小括号以及|来进行分组匹配

小括号的第一个作用是改变限定符的作用范围,小括号的第二个作用是分组,匹配多个子表达式

例如(.[0-9]{1,3}){3},就是对分组(.[0-9]{1,3})进行重复操作。

使用re模块实现正则表达式

import re

Python 提供了re 模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法(如 search()、match()、findall()等进行字符串处理,也可以先使用re 模块的 compile()方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。

匹配字符串

match()

match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回 Match 对象,否则返回 None。

re.match(pattern,string,[flags])

pattem:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。如下标记说明:

search()

search()方法用于在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回 Match对象,否则返回 None。search()方法不仅仅是在字符串的起始位置搜索,其他位置有符合的匹配也可以。

re.search(pattern,string,[flags])

pattem:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

findall()

findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。

strList=re.findall(pattern,string,[flags])

pattem:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

字符串替换sub()

strNew=re.sub(pattern,replace,srcString,count,flags)

pattem:表示模式字符串,由要匹配的正则表达式转换而来。

replace:表示替换的字符串

srcString:要被查找替换的原始字符串

count:可选参数,表示模式匹配后替换的最大次数,默认值为0,表示替换所有的匹配。

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

使用正则表达式分隔字符串split()

strList=re.split(pattern,srcString,[maxsplit],[flags])

pattem:表示模式字符串,由要匹配的正则表达式转换而来。

srcString:要被分隔的原始字符串

maxsplit:可选参数,表示最大拆分次数。默认值为0,表示全部拆分

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

示例程序:

RegexSnake.py

python 复制代码
import math
import re

print("---------测试数学函数以及格式化---------")
print("格式化为5位小数{0:.5f}".format(math.pi))
print("数字{0:.3f}用科学记数法表示为:{0:E}".format((12345.6789)))
print("整数{:d}的二进制为{:#b},八进制为{:#o},十六进制为{:#x}".format(95,95,95,95))
print("弧度{0:.8f}的正弦值为{1:.8f},余弦值为{2:.8f}".format(math.pi/6,math.sin(math.pi/6),math.cos(math.pi/6)))
print("{0:.5f}的反正弦为弧度{1:.5f},角度为{2:.5f}°,反余弦为弧度{3:.5f}".format(0.70711,math.asin(0.70711),math.asin(0.70711)*180/math.pi,math.acos(0.70711)))
print("----------测试天花板ceil和地板floor函数----------")
num=12.345
print("ceil()函数:{:f}".format(math.ceil(num)))
print("floor()函数:{:f}".format(math.floor(num)))
print("---------Python中的正则表达式match()---------")
pattern=R"snake_\w+"
strInput="Snake_python_CSharp"
matchObject=re.match(pattern,strInput,re.IGNORECASE)
print(matchObject,type(matchObject))
if matchObject:
    print("匹配起始索引:", matchObject.start())
    print("匹配结束索引:", matchObject.end())
    print("匹配元组:", matchObject.span())
    print("匹配数据:", matchObject.group())
    print("打印匹配内容:",matchObject.string)
else:
    print("没有找到匹配内容")
strInput="Hello,Snake_python_C#"
matchObject=re.match(pattern,strInput,re.IGNORECASE)
print(matchObject,type(matchObject))
print("打印匹配内容:","未找到匹配" if matchObject==None else matchObject.string)
print("---------Python中的正则表达式search()---------")
matchObject=re.search(pattern,strInput,re.IGNORECASE)
if matchObject!=None:
    print("匹配起始索引:", matchObject.start())
    print("匹配结束索引:", matchObject.end())
    print("匹配元组:", matchObject.span())
    print("匹配数据:", matchObject.group())
    print("打印匹配内容:",matchObject.string)
else:
    print("没有找到匹配内容")
print("---------Python中的正则表达式findall()---------")
strInput="hello,Snake_python_CSharp.snake_1 and viper"
matchList=re.findall(pattern,strInput,re.IGNORECASE)
print(matchList,type(matchList))
for match in matchList:
    print(match,type(match))
print("---------Python中的正则表达式替换字符串sub()---------")
pattern=r"snake\d{1,5}"
srcString="Snake567ABC,snake2XYZ,snakeXX"
print("原字符串:",srcString)
strNew=re.sub(pattern,"viper**",srcString,0,re.IGNORECASE)
print("替换后为:",strNew)
print("---------Python中的正则表达式分隔字符串split()---------")
srcString="Snake567ABC,snake2XYZ,snakeXX.snakeY;snakeCC"
print("原字符串:",srcString)
pattern=r"[,;\.]"
strList=re.split(pattern,srcString,0,re.IGNORECASE)
print("分隔后的列表为:",strList)

运行如图:

相关推荐
databook8 分钟前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar1 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780511 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_2 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机8 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机9 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机9 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i9 小时前
drf初步梳理
python·django
每日AI新事件9 小时前
python的异步函数
python