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

发布于:2025-04-13 ⋅ 阅读:(39) ⋅ 点赞:(0)

正则表达式

正则表达式(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

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)

运行如图:


网站公告

今日签到

点亮在社区的每一天
去签到