Python 标准库之 re (正则表达式操作)

date
Mar 3, 2020
slug
5589749877991424
status
Published
tags
Python
summary
type
Post

re 库的两种对象

Pattern :正则表达式对象 Match :匹配对象

常用内容

search

匹配字符串的第一个位置
In [1]: import re In [2]: s = "I am a simple string"In [3]: r = re.search("am", s) In [4]: r Out[4]: <re.Match object; span=(2, 4), match='am'>In [5]: r.span() Out[5]: (2, 4) In [7]: r.group() Out[7]: 'am'

match

从字符串开始的位置匹配
In [1]: import re In [2]: s = "I am a simple string"In [3]: r = re.match("I", s) In [4]: r Out[4]: <re.Match object; span=(0, 1), match='I'>In [5]: r.span() Out[5]: (0, 1) In [6]: r.group() Out[6]: 'I'In [7]: r = re.match("am", s) In [8]: print(r) None

findall

匹配所有的字串并返回一个匹配列表
In [1]: import re In [2]: s = "Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24)"In [3]: re.findall(r"\d+", s) Out[3]: ['3', '8', '1', '3', '8', '1', '1', '293', '6', '18', '2019', '22', '39', '24']

finditer

返回为一个元素未匹配对象的迭代器
In [1]: import re In [2]: s = "Python 3.8.1"In [3]: r = re.finditer(r"\d+", s) In [4]: r Out[4]: <callable_iterator at 0x56022f8>In [5]: for i in r: ...: print(i) ...: print(i.group()) ...: ...: <re.Match object; span=(7, 8), match='3'>3<re.Match object; span=(9, 10), match='8'>8<re.Match object; span=(11, 12), match='1'>1

sub

替换匹配到的字串
In [1]: import re In [2]: s = "I am a simple string"In [3]: re.sub("s\w*", "python", s) Out[3]: 'I am a python python'

compile

将正则表达式编译为一个 正则表达式对象,用于多次匹配
In [1]: import re In [2]: pattern = r"\d+"In [3]: p = re.compile(pattern) In [4]: r = p.findall("abc123 k23 77") In [5]: r Out[5]: ['123', '23', '77'] In [6]: r = p.findall("1.2@12*g00") In [7]: r Out[7]: ['1', '2', '12', '00']

速查表

函数参数说明

参数
功能
pattern
匹配的正则表达式
string
要匹配的字符串
flags
标志位,用于控制正则表达式的匹配方式
maxsplit
分隔次数,默认为 0,不限制次数
pos
可选参数,指定字符串的起始位置,默认为 0。
endpos
可选参数,指定字符串的结束位置,默认为字符串的长度。
repl
替换的字符串,也可为一个函数
count
模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

标志常量

标志
功能
re.A re.ASCII
让 , , , , 和 只匹配ASCII
re.DEBUG
显示编译时的debug信息,没有内联标记
re.I re.IGNORECASE
忽略大小写匹配
re.L re.LOCALE
由当前语言区域决定 , , 和大小写敏感匹配 (?i)
re.M re.MULTILINE
多行匹配 (?m)
re.S re.DOTALL
让 ‘.’ 特殊字符匹配任何字符,包括换行符 (?s)
re.X re.VERBOSE
这个标记允许你编写更具可读性更友好的正则表达式,空白符号会被忽略,除非在一个字符集合当中或者由反斜杠转义,或者在 *?,(?: 或 (?P<…> 分组之内

函数

函数
功能
re.compile(pattern, flags=0)
将正则表达式的样式编译为一个 正则表达式对象
re.search(pattern, string, flags=0)
扫描整个 string 找到匹配样式的第一个位置,并返回一个相应的匹配对象。如果没有匹配,返回 None
re.match(pattern, string, flags=0)
从 string 的起始位置匹配一个正则表达式样式,匹配就返回一个相应的匹配对象 。 如果没有匹配,返回 None
re.fullmatch(pattern, string, flags=0)
如果整个 string 匹配到正则表达式样式,就返回一个相应的匹配对象 。 否则返回 None
re.split(pattern, string, maxsplit=0, flags=0)
用 pattern 切分 string
re.findall(pattern, string, flags=0)
在 string中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.finditer(pattern, string, flags=0)
在 string中找到正则表达式所匹配的所有子串,并返回一个迭代器
re.sub(pattern, repl, string, count=0, flags=0)
使用 repl 替换字符串中的匹配项
re.subn(pattern, repl, string, count=0, flags=0)
行为与 sub() 相同,但是返回一个元组
re.escape(pattern)
转义 pattern 中的特殊字符
re.purge()
清除正则表达式缓存

正则表达式对象(Pattern)

方法

方法
功能
search(string[, pos[, endpos]])
扫描整个 string 找到匹配样式的第一个位置,并返回一个相应的匹配对象。如果没有匹配,返回 None
match(string[, pos[, endpos]])
从 string 的起始位置匹配一个正则表达式样式,匹配就返回一个相应的匹配对象 。 如果没有匹配,返回 None
fullmatch(string[, pos[, endpos]])
如果整个 string 匹配到正则表达式样式,就返回一个相应的匹配对象 。 否则返回 None
split(string, maxsplit=0)
等价于 split() 函数
finditer(string[, pos[, endpos]])
在 string中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
sub(repl, string, count=0)
等价于 sub() 函数
subn(repl, string, count=0)
等价于 subn() 函数

属性

属性
功能
flags
正则匹配标记
groups
捕获组合的数量
groupindex
映射由 (?P<id>) 定义的命名符号组合和数字组合的字典
pattern
编译对象的原始样式字符串

匹配对象(Match)

方法

方法
功能
expand(template)
对 template 进行反斜杠转义替换并且返回,就像sub() 方法中一样
group([group1, ...])
返回一个或者多个匹配的子组
__getitem__(g)
等价于 m.group(g)
groups(default=None)
返回一个元组,包含所有匹配的子组,在样式中出现的从1到任意多的组合
groupdict(default=None)
返回一个字典,包含了所有的 命名 子组
start([group]) end([group])
返回 group 匹配到的字串的开始和结束标号
span([group])
返回一个二元组包含匹配 (开始,结束) 的位置 (m.start(group), m.end(group))

属性

属性
功能
pos
pos 的值
endpos
endpos 的值
lastindex
最后匹配的捕获组的整数索引,如果没有匹配产生返回 None
lastgroup
最后匹配的捕获组的名称,如果没有匹配产生返回 None
re
返回产生这个实例的 正则对象 ,这个实例是由正则对象的 match() 或 search() 方法产生的
string
传递到 match() 或 search() 的字符串
 
If you have any questions, please contact me.