Summary: re library of Python. from website but I transate some of them for reference.
简单说明
re库是Python的一个内置模块,使用的时候直接引用即可。
Both patterns and strings to be searched can be Unicode strings (
str
) as well as 8-bit strings (bytes
).
模式(查找的条件,对应下面的pattern参数)和被搜索的字符串(搜索目标)即可以是Unicode(即人可以阅读的字符串)也可以是8bit(bytes)的string(即转译为二进制的字符内容)。
However, Unicode strings and 8-bit strings cannot be mixed: that is, you cannot match a Unicode string with a byte pattern or vice-versa; similarly, when asking for a substitution, the replacement string must be of the same type as both the pattern and the search string.
但是Unicode和bytes不能混用:也就是说,不能用字节串模式匹配 Unicode 字符串,反之亦然;同理,替换操作时,替换字符串的类型也必须与所用的模式和搜索字符串的类型一致。
It is important to note that most regular expression operations are available as module-level functions and methods on compiled regular expressions. The functions are shortcuts that don’t require you to compile a regex object first, but miss some fine-tuning parameters.
值得提醒的一点是,基本上所有的函数都支持直接的正则表达式和编译后的正则表达式,不需要事先编译就可以使用这算是一个捷径,当然,这会损失了一些优先的参数。
函数详解
compile函数
将正则表达式编译成一个Pattern对象。Pattern对象可以调用上述函数的同名函数实现对应的功能,事实上,在上述函数的底层,也是先通过传入的pattern和flags函数编译出对应的Pattern对象,再调用Pattern对象的相应函数的。
def compile(pattern, flags=0) #函数接口
示例如下。
>>> pattern = re.compile('\d{2}')
>>> pattern.match('09计算机71软件工程91人工智能')
<re.Match object; span=(0, 2), match='09'>
match函数:
从字符串的开头进行匹配,返回一个Match对象,失败则返回空对象。
def match(pattern, string, flags=0) #函数接口
示例如下,match是从字符串开头开始进行匹配的,第一个命令成功的匹配了目标字符串中的09,而第二个命令中,尽管目标字符串中有计算机,但因为它不在字符串的开头,所以依然匹配失败。如果希望取消从头开始的限制,我们需要借助search函数解决。
>>>re.match('\d{2}','09计算机71软件工程')
<re.Match object; span=(0, 2), match='09'>
>>>re.match('计算机','09计算机71软件工程')
fullmatch函数
匹配整个字符串,返回一个Match对象,如果匹配失败则返回空对象
def fullmatch(pattern, string, flags=0) #函数接口
示例如下,可以发现fullmatch是针对目标字符串整体而言进行匹配的。
>>> re.fullmatch('\d*软件','71软件工程')
>>> re.fullmatch('\d*软件工程','71软件工程')
<re.Match object; span=(0, 6), match='71软件工程'>
search函数
在字符串中搜索与pattern匹配的部分,返回一个Match对象,如果匹配失败则返回空对象
def search(pattern, string, flags=0) #函数接口
示例如下,可以发现search不再受到match中的限制,它将从左到右、在整个字符串中搜索与pattern匹配的部分,直到找到第一个匹配时停止。
>>> re.search('\d{2}','09计算机71软件工程')
<re.Match object; span=(0, 2), match='09'>
>>> re.search('计算机','09计算机71软件工程')
<re.Match object; span=(2, 5), match='计算机'>
>>> re.search('人工智能','09计算机71软件工程')
sub函数
在目标字符串中搜索到匹配pattern的部分(包括接下来的函数同样适用的一点,这种匹配的部分彼此之间并不重叠),并将它替换为repl,返回替换后的字符串。 如果匹配失败,则原封不动的返回string。repl可以是字符串或是回调函数;如果它是字符串,则其中任何反斜杠转义序列都会被处理,像\n就会被转换为换行符。默认状态(count=0)的情况下我们会将所有符合pattern的部分都替换,如果希望只替换部分,可以通过count控制次数
def sub(pattern, repl, string, count=0, flags=0) #函数接口
示例如下。
>>> re.sub('\d{2}','_','09计算机71软件工程91人工智能')
'_计算机_软件工程_人工智能'
>>> re.sub('\d{3}','_','09计算机71软件工程91人工智能')
'09计算机71软件工程91人工智能'
>>> re.sub('\d{2}','_','09计算机71软件工程91人工智能',1)
'_计算机71软件工程91人工智能'
>>> re.sub('\d{2}','_','09计算机71软件工程91人工智能',2)
'_计算机_软件工程91人工智能'
如果repl是一个函数,则它应该接受一个Match对象作为参数,并且返回一个用于替换的字符串,这种情况下可以对匹配后的内容进行进一步的分类处理。
>>> def my_repl(matchobj):
... if matchobj.group(0) == '09': return 'CS'
... elif matchobj.group(0) == '71': return 'SE'
... elif matchobj.group(0) == '91': return 'AI'
...
>>> re.sub('\d{2}',my_repl,'09计算机71软件工程91人工智能')
'CS计算机SE软件工程AI人工智能'
subn函数
返回(’字符串‘,替换次数)的二元组,其它的用法和上述sub函数一致
def subn(pattern, repl, string, count=0, flags=0) #函数接口
示例如下。
>>> re.subn('\d{2}','_','09计算机71软件工程91人工智能')
('_计算机_软件工程_人工智能', 3)
>>> re.subn('\d{2}','_','09计算机71软件工程91人工智能',2)
('_计算机_软件工程91人工智能', 2)
>>> re.subn('\d{3}','_','09计算机71软件工程91人工智能',2)
('09计算机71软件工程91人工智能', 0)
split函数
将目标字符串以匹配pattern的部分作为隔板进行分隔,返回一个子字符串的列表。如果正则表达式采用了捕获组的形式,那么匹配pattern的部分也会被放入结果列表。默认状态(maxsplit=0)的情况下我们会分割整个目标字符串,在指定maxsplit的情况下,我们在前maxsplit个隔板的位置做字符串分割,而把最后的剩余部分作为一个完整的字串返回
def split(pattern, string, maxsplit=0, flags=0) #函数接口
示例如下,要注意如果匹配到字符串的开始,那么结果会以一个空字符串开始。这点对于匹配到结尾的情况也是同理。
>>> re.split('\d{2}','09计算机71软件工程91人工智能')
['', '计算机', '软件工程', '人工智能']
>>> re.split('(\d{2})','09计算机71软件工程91人工智能')
['', '09', '计算机', '71', '软件工程', '91', '人工智能']
>>> re.split('(\d{2})','09计算机71软件工程91人工智能',2)
['', '09', '计算机', '71', '软件工程91人工智能']
findall函数
以列表的形式返回目标字符串中与pattern匹配的部分,如果正则表达式中含有一个或多个捕获组,则会返回一个捕获组列表
def findall(pattern, string, flags=0) #函数接口
示例如下,我们发现在正则表达式中含有两个捕获组时,该函数也返回对应顺序的二元组。而当匹配失败时,函数会返回一个空列表。
>>> re.findall('\d{2}','09计算机71软件工程91人工智能')
['09', '71', '91']
>>> re.findall('(\d{2})([a-z]{2})','09aa计算机71bb软件工程91cc人工智能')
[('09', 'aa'), ('71', 'bb'), ('91', 'cc')]
>>> re.findall('\d{3}','09计算机71软件工程91人工智能')
[]
finditer函数
返回一个表示字符串中与pattern匹配部分的可迭代对象,可迭代对象中的每一个元素都是一个对应的Match对象
def finditer(pattern, string, flags=0) #函数接口
示例如下,我们通过该函数对目标字符串实现了一个遍历。
>>> re.finditer('\d{2}','09计算机71软件工程91人工智能')
<callable_iterator object at 0x00000182DFE37D88>
>>> result = re.finditer('\d{2}','09计算机71软件工程91人工智能')
>>> for i in result:
... print(i.group())
...
09
71
91
–遇到新的内容会存时补充–