RE库是python标准库,主要用于字符串匹配。
re库采用raw string类型。书写格式为r'text'
原生字符串,是不包含转义符的字符串。如果直接使用string 类型表示正则,则需要转义掉转义符。因此直接使用原生字符串较为简单。
RE 的主要函数
re.search() #在字符串中搜索和正则匹配的第一个位置。
re.match() #从字符串开始位置起匹配。
re.findall() #搜索字符串,以列表返回全部匹配的子串。
re.split() #将一个字符串正则匹配结果进行分割,返回一个列表。
re.finditer() #搜索字符串,返回迭代类型,每个迭代元素都是一个match对象。
re.sub() #在一个字符串中替换所以匹配正则的子串,返回替代后的。
re.search
re.search(pattern, string, flags = 0)
利用正则pattern 匹配string,同时利用flags 控制查找。
其中的flags,表示正则表达式使用的控制标记。常用标记包括:
re.I #re.IGNORECASE,忽略正则的大小写区分,[A-Z]可以匹配大小写字母。
re.M #re.MULTILINE,可以使^ 能够匹配给定字符串每行的开始部分。
re.S #re.DOTALL,可以使. 匹配所有的字符,包括默认下无法匹配的换行符。
尝试一下
>>> import re
>>> match = re.search(r'[1-9]\d{5}', 'AHAU 200036')
>>> if match:
... print(match.group(0))
...
200036
re.match
re.match(pattern, string, flags = 0)
参数和search 一样。
需要注意的是,如果是使用match,会从字符串的起始部分进行匹配。因此若不进行调整,即依旧为'AHAU 200036'
,match 则匹配不到。
>>> import re
>>> match = re.match(r'[1-9]\d{5}', '200036 AHAU')
>>> if match:
... print(match.group(0))
...
200036
re.findall
以列表返回全部匹配到的子串。
>>> match = re.findall(r'[1-9]\d{5}', '200036AHAU TSU100084 345')
>>> if match:
... print(match)
...
['200036', '100084']
re.split
将正则与字符串匹配的部分删除,并将剩下内容进行分割。
re.match(pattern, string, maxsplit = 0, flags = 0)
maxsplit 表示最大分割数(识别并进行切割的最大数字),超过最大分割部分以整体输出。
>>> re.split(r'[1-9]\d{5}', 'AHAU200036 TSU100084')
['AHAU', ' TSU', '']
增加maxsplit参数,只匹配并切割一次,剩下的部分以整体输出。
>>> re.split(r'[1-9]\d{5}', 'AHAU200036 TSU100084', maxsplit = 1)
['AHAU', ' TSU100084']
re.finditer
迭代获得每次匹配结果,返回一个match类型。
>>> for m in re.finditer(r'[1-9]\d{5}', 'AHAU200036 TSU100084'):
... if m:
... print(m.group(0))
...
200036
100084
re.sub
re.sub(pattern, repl, string, count = 0, flags = 0)
repl 表示替换匹配字符串的字符串
count 表示匹配的最大替换次数。(和maxsplit 的功能差不多)
>>> re.sub(r'[1-9]\d{5}', 'unknown', 'AHAU:200036 TSU:100084')
'AHAU:unknown TSU:unknown'
可以加一个count 参数
>>> re.sub(r'[1-9]\d{5}', 'unknown', 'AHAU:200036 TSU:100084', count = 1)
'AHAU:unknown TSU:100084'
re 的其他用法
对于一套正则表达式的多次使用,如果每一次都重新定义一遍pattern,未免显得非常的繁琐。我们可以使用一种面向对象的做法。
先讲正则经过一次编译,将正则的原生字符串编译为一个正则表达式对象。
import re
zcode = re.complie(r'[1-9]\d{5}')
match = zcode.match('200036 AHAU')
search = zcode.search('TSU 100084')
而它的使用,也和基本使用是一摸一样的。
详谈RE库的match 对象
match 对象是search, match, finditer 这些方法返回的结果。
>>> match = re.search(r'[1-9]\d{5}', '200036AHAU TSU100084 345')
>>> match.group(0)
'200036'
>>> match
<re.Match object; span=(0, 6), match='200036'>
>>> type(match)
<class 're.Match'>
match对象的属性
.string #待匹配的文本
.re #匹配时使用pattern对象(正则)
.pos #正则表达式搜索文本开始
.endpos #正则表达式搜索文本末尾
>>> m = re.search(r'[1-9]\d{5}', '200036AHAU TSU100084 345')
>>> m.string
'200036AHAU TSU100084 345'
>>> m.re
re.compile('[1-9]\\d{5}')
>>> m.pos
0
>>> m.endpos
24
match 对象的方法
.group(0) #获得匹配后字符串
.start() #匹配字符串在原始字符串的开始位置
.end() #匹配字符串在原始字符串的结束位置
.span() #返回元组类型,包含start与end
>>> m.group(0)
'200036'
>>> m.start()
0
>>> m.end()
6
>>> m.span()
(0, 6)