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