【Python3之正则re】
⼀、正则re
1.正则表达式定义
正则就是⽤⼀些具有特殊含义的符号组合到⼀起(称为正则表达式)来描述字符或者字符串的⽅法。或者说:正则就是⽤来描述⼀类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成⼀系列的字节码,然后由⽤ C 编写的匹配引擎执⾏。
2.常⽤的正则表达式
pyre
3.贪婪模式与⾮贪婪模式
正则表达式通常⽤于在⽂本中查匹配的字符串。Python⾥数量词默认是贪婪的(在少数语⾔⾥也可能是默认⾮贪婪),总是尝试匹配尽可能多的字符;⾮贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式"ab*"如果⽤于查"abbbc",将到"abbb"。⽽如果使⽤⾮贪婪的数量词"ab*?",将到"a"。
4.反斜杠
与⼤多数编程语⾔相同,正则表达式⾥使⽤"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配⽂本中的字符"\",那么使⽤编程语⾔表⽰的正则表达式⾥将需要4个反斜杠"\\\\":前两个和后两个分别⽤于在编程语⾔⾥转义成反斜杠,转换成两个反斜杠后再在正则表达式⾥转义成⼀个反斜杠。Python⾥的原⽣字符串很好地解决了这个问题,这个例⼦中的正则表达式可以使⽤r"\\"表⽰。同样,匹配⼀个数字的"\\d"可以写成r"\d"。有了原⽣字符串,你再也不⽤担⼼是不是漏写了反斜杠,写出来的表达式也更直观。
<模块
Python通过re模块提供对正则表达式的⽀持。使⽤re的⼀般步骤是先将正则表达式的字符串形式编译为Pattern实例,然后使⽤Pattern实例处理⽂本并获得匹配结果(⼀个Match实例),最后使⽤Match实例获得信息,进⾏其他的操作。
Match
Match对象是⼀次匹配的结果,包含了很多关于此次匹配的信息,可以使⽤Match提供的可读属性或⽅法来获取这些信息。
属性:
1. string: 匹配时使⽤的⽂本。
2. re: 匹配时使⽤的Pattern对象。
3. pos: ⽂本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()⽅法的同名参数相同。
4. endpos: ⽂本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()⽅法的同名参数相同。
5. lastindex: 最后⼀个被捕获的分组在⽂本中的索引。如果没有被捕获的分组,将为None。
6. lastgroup: 最后⼀个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
⽅法:
group([group1, …]):
获得⼀个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使⽤编号也可以使⽤别名;编号0代表整个匹配的⼦串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后⼀次截获的⼦串。
groups([default]):
以元组形式返回全部分组截获的字符串。相当于调⽤group(1,2,…last)。default表⽰没有截获字符串的组以这个值替代,默认为None。
groupdict([default]):
返回以有别名的组的别名为键、以该组截获的⼦串为值的字典,没有别名的组不包含在内。default含义同上。
start([group]):
返回指定的组截获的⼦串在string中的起始索引(⼦串第⼀个字符的索引)。group默认值为0。
end([group]):
返回指定的组截获的⼦串在string中的结束索引(⼦串最后⼀个字符的索引+1)。group默认值为0。
span([group]):
返回(start(group), end(group))。
expand(template):
将匹配到的分组代⼊template中然后返回。template中可以使⽤\id或\g<id>、\g<name>引⽤分组,但不能使⽤编号0。\id与\g<id>是等价的;但\10将被认为是第10个分组,如果你想表达\1之后是字符'0',只能使⽤\g<1>0。
例:
import re
m = re.match(r'(\w+) (\w+)(?P<sign>.*)', 'hello world!')
print("m.string:", m.string)
print("m.re:", m.re)
print("m.pos:", m.pos)
print("m.endpos:", m.endpos)
print("m.lastindex:", m.lastindex)
print("m.lastgroup:", m.lastgroup)
print("m.group(1,2):", m.group(1, 2))
print("m.groups():", m.groups())
print("m.groupdict():", m.groupdict())
print("m.start(2):", m.start(2))
print("m.end(2):", m.end(2))
print("m.span(2):", m.span(2))
print(pand(r'\2 \1\3'):", m.expand(r'\2 \1\3'))
输出
m.string: hello world!
<: repile('(\\w+) (\\w+)(?P<sign>.*)')
m.pos: 0
m.lastindex: 3
m.lastgroup: sign
m.start(2): 6
m.span(2): (6, 11)
Pattern
Pattern对象是⼀个编译好的正则表达式,通过Pattern提供的⼀系列⽅法可以对⽂本进⾏匹配查。
Pattern不能直接实例化,必须使⽤repile()进⾏构造。
Pattern提供了⼏个可读属性⽤于获取表达式的相关信息:
1. pattern: 编译时⽤的表达式字符串。
2. flags: 编译时⽤的匹配模式。数字形式。
3. groups: 表达式中分组的数量。
4. groupindex: 以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。例:
import re
p = repile(r'(\w+) (\w+)(?P<sign>.*)', re.DOTALL)
print("p.pattern:", p.pattern)
print("p.flags:", p.flags)
print("p.groups:", p.groups)
print("p.groupindex:", p.groupindex)
输出
p.pattern: (\w+) (\w+)(?P<sign>.*)
p.flags: 48
实例⽅法[ | re模块⽅法]:
match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]):
这个⽅法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回⼀个Match对象;如果匹配过程中pattern⽆法匹配,或者匹配未结束就已到达endpos,则返回None。
pos和endpos的默认值分别为0和len(string);re.match()⽆法指定这两个参数,参数flags⽤于编译pattern时指定匹配模式。
注意:这个⽅法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。
⽰例参见2.1⼩节。
search(string[, pos[, endpos]]) | re.search(pattern, string[, flags]):
这个⽅法⽤于查字符串中可以匹配成功的⼦串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回⼀个Match对象;若⽆法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍⽆法匹配则返回None。
pos和endpos的默认值分别为0和len(string));re.search()⽆法指定这两个参数,参数flags⽤于编译pattern时指定匹配模式。
import re
# 将正则表达式编译成Pattern对象
python正则表达式不包含pattern = repile(r'world')
# 使⽤search()查匹配的⼦串,不存在能匹配的⼦串时将返回None
# 这个例⼦中使⽤match()⽆法成功匹配
match = pattern.search('hello world!')
if match:
# 使⽤Match获得分组信息
up())
输出
world
split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):
按照能够匹配的⼦串将string分割后返回列表。maxsplit⽤于指定最⼤分割次数,不指定将全部分割。
import re
p = repile(r'\d+')
print(p.split('one1two2three3four4'))
输出
['one', 'two', 'three', 'four', '']
findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags]):
搜索string,以列表形式返回全部能匹配的⼦串。
import re
p = repile(r'\d+')
print(p.findall('one1two2three3four4'))
输出
['1', '2', '3', '4']
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论