正则表达式介绍
正则表达式用于在字符串文本中匹配所要搜索的字符串样式,比如验证用户输入的邮箱格式是否正确,IP地址格式是否有误以及查找字符串中所有的网址等等…
注意,正则表达式是对文本格式的一种概括语法,其不局限于Python语言,只要是支持正则表达式的语言都可以用应用
一、正则表达式语法规则
正则表达式详细的语法可以百度或者参考菜鸟教程正则表达式
练习正则表达式语法可以参考菜鸟正则表达式在线测试器里面同时有一些常见的格式如身份证、IP等等现成的格式可套用。
篇幅较多本文在此不再复述
二、Python中应用正则表达式
1.导入re标准库
re是python用于支持正则表达式的标准库
常用的函数及语法如下:
- re.compile() 用于通过正则表达式语法创建正则表达式对象以方便后续调用
#示例
import re
Tmpre1=re.compile(r'2(5[0-5]|4\d)|1?\d{1,2}')
- re.match() 用于从文本开始查找匹配的文本内容,如果没有找到则返回None
import re
str1 = '241.255.2.30'
str2 = '...241.255.2.30'
Tmpre1=re.compile(r'2(5[0-5]|4\d)|1?\d{1,2}')
Tmpre2=re.compile(r'2(5[0-5]|4\d)|1?\d{1,2}')
print(Tmpre1.match(str1))
print(Tmpre1.match(str2))
输出如下:
<re.Match object; span=(0, 3), match='241'>
None
- re.search() 用于人文本中搜索第一个匹配的文本,并返回找到的第一个文本的内容,如果没有找到则返回None
#示例:
import re
str1 = '...241.255.2.30'
re4=re.compile(r'2(5[0-5]|4\d)|1?\d{1,2}')
re5=re.compile(r'25[0-5]|24\d|1?\d{1,2}')
print(re4.search(str1,3))
print('{:20}{}'.format('March',re4.search(str1)))
print('{:20}{}'.format('March.group()',re4.search(str1).group()))#返回一个或者多个匹配的子组。如果只有一个参数,结果就是一个字符串,如果有多个参数,结果就是一个元组(每个参数对应一个项),如果没有参数,组1默认到0(整个匹配都被返回)
print('{:20}{}'.format('March.startpos',re4.search(str1).start()))
print('{:20}{}'.format('March.end()',re4.search(str1).end()))#返回 group 匹配到的字串的开始和结束标号。group 默认为0(意思是整个匹配的子串)。如果 group 存在,但未产生匹配,就返回 -1
print('{:20}{}'.format('March.endpos',re4.search(str1).endpos))#这个是正则引擎停止在字符串搜索一个匹配的索引位置。
print('{:20}{}'.format('March.re',re4.search(str1).re))#返回产生这个实例的 正则对象
print('{:20}{}'.format('March.pos',re4.search(str1).pos))#这个是正则引擎开始在字符串搜索一个匹配的索引位置。
print('{:20}{}'.format('March.regs',re4.search(str1).regs))
print('{:20}{}'.format('March.string',re4.search(str1).string))#输出所要搜索的字符串
print('{:20}{}'.format('March.findall',re4.findall(str1)))
print('{:20}{}'.format('March.findall',re5.findall(str1)))
输出如下:
<re.Match object; span=(3, 6), match='241'>
March <re.Match object; span=(3, 6), match='241'>
March.group() 241
March.end() 6
March.start() 3
March.endpos 15
March.re re.compile('2(5[0-5]|4\\d)|1?\\d{1,2}')
March.pos 0
March.regs ((3, 6), (4, 6))
March.string ...241.255.2.30
March.findall ['41', '55', '', '']
March.findall ['241', '255', '2', '30']
注意上面示例中re.findall()当匹配带括号和不带括号的正则表达式的时候输出值的不同:
- 当正则表达式带括号时,findall()返回的值只是包含在括号之内的数值
- 当正则表达 式不带括号时,findall()返回的值是正则表达式所所找到的所有的匹配值
2.如何找到所有匹配正则表达式的文本?
无论是re,match()或者re.search()都只能搜索到一个字符结果即返回,那么如何将一段字符串中的所有文本都找出来并返回呢?
没有直接的方法,但我们可以通过调用search()函数自己做个函数来实现
Pattern.search(string[, pos[, endpos]]) 扫描整个 string 寻找第一个匹配的位置,
并返回一个相应的 匹配对象。如果没有匹配,就返回 None ;注意它和零长度匹配是不同的。
通过在search()中设置每次搜索的开始位置,让search()遍历整个文本串即可完成整个文本的搜索
代码实现:
import re
def ReFind(str1,march,start=0):
"""Search all the string find out all the text which fullfill the re
Args:
str1 (string): the string which going to be search
march (Match type of the re.compile()): your re.compile()type
start (int, optional): start position of the string . Defaults to 0.
Returns:
string: all the text which founded
"""
TmpResut = ''
startPos=0
try:
TmpResut = march.search(str1,start).group()
startPos = march.search(str1,start).end()
if startPos<len(str1):
TmpResut += ','+ReFind(str1,march,startPos)
return TmpResut
else:
return TmpResut
except :
print('re Error expected')
输出如下:
241,255,2,30
Python re模块常用的几种正则表达式方式
import re
# 正则表达式match用法,其会从字符串开头进行匹配,如果不匹配则返回None,反之找到一个匹配后需要调用group()来获取找到的值
print("re.match is: {}".format(re.match(r"\w", "hf").group()))
print("re.match is: {}".format(re.match(r"\w", "<hf").group()) if re.match(r"\w", "<hf") is not None else "No value")
# search 会在字符串中从前向后寻找,直到找到一个匹配值,如果不匹配则返回None,反之找到一个匹配后需要调用group()来获取找到的值
print("re.search is: {}".format(re.search(r"(h|f|\d+s)", "<hf10s").group()))
# findall用于寻找字符串中所有非重复的匹配项并返回一个列表或元组形式的结果
print("re.findall is: {}".format(re.findall(r"(h|f|\d+s)", "<hf10s")))
# finditer用于寻找字符串中所有非重复的匹配项并返回一个迭代器,迭代器以match类型返回
for m_findall in re.finditer(r"(h|f|\d+s)", "<hf10s"):
print("find all value is: {}".format(m_findall.group()))
输出结果:
re.match is: h
No value
re.search is: h
re.findall is: [‘h’, ‘f’, ‘10s’]
find all value is: h
find all value is: f
find all value is: 10s
总结
Python 通过re标准库来实现正则表达式匹配 正常情况下re.search()比re.match()要方便些
通过re.group()来获取相应的结果,但group结果也要根据所要搜索的参数返回整个字符串或者元组
通过re.start()和re.end()来获取正则匹配结果的开始位置及结束位置